PostgreSQL stöder standard SQL-arrayer och standarden alla op (. ..) syntax:
Det betyder att du kan bygga SQL så här:
where name ilike any (array['%Richard%', '%Feynman%'])
Det är trevligt och kortfattat, så hur får vi Rails att bygga detta? Det är faktiskt ganska enkelt:
Model.where('name ilike any (array[?])', names.map { |s| "%#{s}%" })
Ingen manuell citering behövs, ActiveRecord kommer att konvertera arrayen till en korrekt citerad/escaped lista när den fyller ?
platshållare i.
Nu behöver du bara bygga namnen
array. Något enkelt som det här borde göra:
fields = params.keys.select { |k| k.to_s =~ /\Afield\d+\z/ }
names = params.values_at(*fields).select(&:present)
Du kan också konvertera enstaka 'a b'
inmatningar i 'a', 'b'
genom att kasta en split
och platta ut
i mixen:
names = params.values_at(*fields)
.select(&:present)
.map(&:split)
.flatten