PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Envoi d'un tableau de valeurs à une requête sql en ruby ?

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