活动记录嵌套数组

问题描述 投票:0回答:1

当把一个数组作为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})))

可以使用,但依赖于一些手动连接转义,似乎并不理想(而且不容易在此范围外推广)。

ruby-on-rails rails-activerecord
1个回答
2
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.