Rails 使用哈希数组查找记录

8bi*_*ero 2 ruby ruby-on-rails arel ruby-on-rails-5

(选择使用子句按字段对进行查询in

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

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

我想返回的是Items表中与数组中的字段对匹配的所有记录。

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

SELECT * 
FROM items
WHERE (product_id, group_id) IN (VALUES (7629,4), (8202,3))
Run Code Online (Sandbox Code Playgroud)

但我在使用 Rails 条款来做到这一点时遇到了麻烦.where。这可能吗?

bra*_*bag 5

我想不出有什么方法可以在不诉诸 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)))
Run Code Online (Sandbox Code Playgroud)