Rails 使用哈希数组查找记录

Rails find records using an array of hashes

(Select 使用 in 子句按字段对查询)

我有一个哈希数组,如下所示:

[ {product_id: 7629, group_id: 4}, {product_id: 8202, group_id: 3} ]

我想要return的是Itemstable中与数组中的一对字段匹配的所有记录。

在 SQL 中,它将像这样检索:

SELECT * 
FROM items
WHERE (product_id, group_id) IN (VALUES (7629,4), (8202,3))

但是我在使用 rails .where 子句时遇到了问题。这可能吗?

如果不求助于 SQL,我想不出任何方法来做到这一点,即使是 Arel。

由于不能引用数组,我们必须做一些愚蠢的事情来仍然允许它被清理。这不是一个 很好的 解决方案,但它是一个有效的解决方案。

your_hashes = [ {product_id: 7629, group_id: 4}, {product_id: 8202, group_id: 3} ]

# turn hashes into simple value array
conditions = your_hashes.map { |h| [ h[:product_id], h[:group_id] ] }
=> [[7629, 4], [8202, 3]]

# create a list of "(?)" values that will allow the conditions to be passed in
values = ("(?)," * conditions.length)[0..-2]
=> "(?),(?)"

# use it to look up the values
Model.where("(product_id, group_id) IN (VALUES #{values})", *conditions)

# this is the generated sql:
SELECT "models".* FROM "models" WHERE ((product_id, group_id) IN (VALUES (7629,4),(8202,3)))

我认为在这种情况下使用 SQL 的 IN 没有任何好处。

我会使用 where 作为第一个条件,并使用 or 链接所有其他条件(并让 Rails 负责清理和繁重的工作):

array = [{ product_id: 7629, group_id: 4 }, { product_id: 8202, group_id: 3 }]
array[1..-1].inject(Model.where(array[0])) { |m, h| m.or(Model.where(h)) }