PostgreSQL prend en charge les tableaux SQL standard et le standard any op (...)
syntaxe :
Cela signifie que vous pouvez créer SQL comme ceci :
where name ilike any (array['%Richard%', '%Feynman%'])
C'est joli et succinct, alors comment pouvons-nous faire en sorte que Rails construise cela ? C'est en fait assez simple :
Model.where('name ilike any (array[?])', names.map { |s| "%#{s}%" })
Aucune citation manuelle nécessaire, ActiveRecord convertira le tableau en une liste correctement citée/échappée lorsqu'il remplira le ?
espace réservé dans.
Il ne vous reste plus qu'à construire les names
déployer. Quelque chose de simple comme ceci devrait suffire :
fields = params.keys.select { |k| k.to_s =~ /\Afield\d+\z/ }
names = params.values_at(*fields).select(&:present)
Vous pouvez également convertir un seul 'a b'
entrées dans 'a', 'b'
en lançant un split
et flatten
dans le mix :
names = params.values_at(*fields)
.select(&:present)
.map(&:split)
.flatten