当把一个数组作为SQL输入时,有什么方法模式可以对数组进行消毒吗?
希望在ActiveRecord中实现以下风格的查询。
SELECT *
FROM "addresses"
WHERE ("addresses"."city", "addresses"."state", "addresses"."country") IN (
('Juneau', 'AK', 'US'),
('Albany', 'NY', 'US'),
...
)
例如:
searches = [
['Juneau', 'AK', 'US'],
['Albany', 'NY', 'US'],
]
searches_sql = searches.map do |search|
"(#{search.map { |query| Address.connection.quote(query) }.join(', ')})"
end.join(', ')
Address.where(%(("addresses"."city", "addresses"."state", "addresses"."country") IN (#{searches_sql})))
可以使用,但依赖于一些手动连接转义,似乎并不理想(而且不容易在此范围外推广)。
ActiveRecord实际上并没有一个内置的方法来构造一个数组。WHERE columns IN values
查询。
但你可以用Arel来做。
class Address
def self.search(sets)
where(
Arel::Nodes::In.new(
[:city, :state, :country].map { |c| arel_table[c] },
sets.map do |set|
Arel::Nodes::Grouping.new(
set.map {|value| Arel::Nodes.build_quoted(value)}
)
end
)
)
end
end