PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Invio di una matrice di valori a una query sql in ruby?

PostgreSQL supporta gli array SQL standard e lo standard any op (...) sintassi:

Ciò significa che puoi creare SQL in questo modo:

where name ilike any (array['%Richard%', '%Feynman%'])

È carino e conciso, quindi come possiamo convincere Rails a costruirlo? In realtà è abbastanza facile:

Model.where('name ilike any (array[?])', names.map { |s| "%#{s}%" })

Non sono necessarie citazioni manuali, ActiveRecord converte l'array in un elenco con virgolette/escape corretto quando riempie il ? segnaposto dentro.

Ora non ti resta che creare i names Vettore. Qualcosa di semplice come questo dovrebbe fare:

fields = params.keys.select { |k| k.to_s =~ /\Afield\d+\z/ }
names  = params.values_at(*fields).select(&:present)

Puoi anche convertire un singolo 'a b' immissioni in 'a', 'b' lanciando una split e flatten nel mix:

names = params.values_at(*fields)
              .select(&:present)
              .map(&:split)
              .flatten