【发布时间】:2020-04-22 11:48:39
【问题描述】:
有没有办法在 Arel 中以编程方式创建 where 子句,其中列和值分别指定?
SELECT users.*
WHERE (country, occupation) IN (('dk', 'nurse'), ('ch', 'doctor'), ...
假设输入是我们想要匹配的很长的对列表。
我不是在问如何生成一个 WHERE AND OR 子句,这对于 ActiveRecord 来说非常简单。
到目前为止,我只有基本的字符串操作:
columns = [:country, :occupation]
pairs = [['dk', 'nurse'], ['ch', 'doctor']]
User.where(
"(#{columns.join(', ')}) IN (#{ pairs.map { '(?, ?)' }.join(', ')})",
*pairs
)
这不仅与查询的长度有关,WHERE (columns) IN (values) 还将 perform much better on Postgres(以及其他),因为它可以使用仅索引扫描,而 OR 将导致位图扫描。
我只是在寻找可以证明使用 Arel 生成 WHERE (columns) IN (values) 查询的答案。没有别的。
我读过的所有关于 Arel 的文章都开始建立一个专栏:
arel_table[:foo].eq...
而且我还没有找到任何涉及此案例的文档或文章。
【问题讨论】:
-
这个问题只是为了好奇——我只是在寻找一种更好的方法,它可以更容易地组合不同的输入,例如哈希数组。
标签: ruby-on-rails arel