ruby-on-rails - ActiveRecord 嵌套数组
问题描述
在将数组用作 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
推荐阅读
- java - 无法使用 Quarkus 中的托管执行器持久化实体
- angular - ion-tabs 阻止我与页面交互
- node.js - 获取在 HTML 页面中工作但不在 JS 页面中工作
- python - 从父包导入模块
- vue.js - 在 Nuxt 中硬刷新时的 asyncData 钩子
- java - 当@Configuration 时,Spring @Value 在类实现上返回 Null
- javascript - 如何访问跨域 iframe 的原始 DOM?
- sql - 如何分组并获得特定的输出
- java - java.sql.Blob 的模式验证,预期正确,但发现类型错误
- http - 在 web.xml 中阻止不需要的 HttpMethods