Rails 使用哈希数组查找记录
Rails find records using an array of hashes
(Select 使用 in
子句按字段对查询)
我有一个哈希数组,如下所示:
[ {product_id: 7629, group_id: 4}, {product_id: 8202, group_id: 3} ]
我想要return的是Items
table中与数组中的一对字段匹配的所有记录。
在 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)) }
(Select 使用 in
子句按字段对查询)
我有一个哈希数组,如下所示:
[ {product_id: 7629, group_id: 4}, {product_id: 8202, group_id: 3} ]
我想要return的是Items
table中与数组中的一对字段匹配的所有记录。
在 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)) }