O PostgreSQL suporta arrays SQL padrão e o padrão
any op (...)
sintaxe:Isso significa que você pode construir SQL assim:
where name ilike any (array['%Richard%', '%Feynman%'])
Isso é bom e sucinto, então como fazemos para o Rails construir isso? Isso é realmente muito fácil:
Model.where('name ilike any (array[?])', names.map { |s| "%#{s}%" })
Nenhuma citação manual é necessária, o ActiveRecord converterá o array em uma lista com aspas/escapados corretamente quando preencher o
?
marcador de posição em. Agora você só precisa construir os
names
variedade. Algo simples como isso deve fazer:fields = params.keys.select { |k| k.to_s =~ /\Afield\d+\z/ }
names = params.values_at(*fields).select(&:present)
Você também pode converter um único
'a b'
entradas em 'a', 'b'
lançando um split
e flatten
na mistura:names = params.values_at(*fields)
.select(&:present)
.map(&:split)
.flatten