PostgreSQL 支持标准 SQL 数组和标准any op (...) syntax:
9.23.3。任何/一些(数组)
expression operator ANY (array expression)
expression operator SOME (array expression)
右侧是一个带括号的表达式,它必须生成一个数组值。使用给定的值计算左侧表达式并与数组的每个元素进行比较operator,它必须产生布尔结果。的结果ANY
如果获得任何真实结果,则为“true”。如果未找到 true 结果(包括数组有零个元素的情况),则结果为“false”。
这意味着您可以像这样构建 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
and flatten
混合:
names = params.values_at(*fields)
.select(&:present)
.map(&:split)
.flatten