PostgreSQL поддържа стандартни SQL масиви и стандартния any op (...)
синтаксис:
Това означава, че можете да изградите SQL по този начин:
where name ilike any (array['%Richard%', '%Feynman%'])
Това е хубаво и кратко, така че как да накараме Rails да изгради това? Това всъщност е доста лесно:
Model.where('name ilike any (array[?])', names.map { |s| "%#{s}%" })
Не е необходимо ръчно поставяне в кавички, ActiveRecord ще преобразува масива в правилно кавиран/екраниран списък, когато запълни ?
заместител в.
Сега просто трябва да създадете names
масив. Нещо просто като това трябва да свърши работа:
fields = params.keys.select { |k| k.to_s =~ /\Afield\d+\z/ }
names = params.values_at(*fields).select(&:present)
Можете също така да конвертирате единичен 'a b'
въвежда в 'a', 'b'
чрез хвърляне на split
и flatten
в микса:
names = params.values_at(*fields)
.select(&:present)
.map(&:split)
.flatten