动态附加.or()调用基于数组元素的活动记录查询

时间:2014-11-22 23:16:00

标签: ruby-on-rails ruby rails-activerecord

我有一个运行条件的函数,其中查询使用哈希来链接带有AND的条件。

hash = {:cond1 => 6, :cond2 => 3, :cond3 => 7}

Object.where(hash)

这对我来说似乎很好。

问题是,如果我有一个哈希数组,例如:

ary = [{:cond1 => 6, :cond2 => 3, :cond3 => 7},{:cond4 => 6, :cond5 => 3, :cond6 => 7},....]

我如何动态地将ary [0]之后的每个哈希作为OR子句链接到where查询,如下所示:

Object.where(ary[0]).or(ary[1]).or(ary[2])....

我想我可能不得不使用lambdas或块,但我不确定如何实现它。

1 个答案:

答案 0 :(得分:1)

您可以使用inject构建查询:

ary[1..-1].inject(Object.where(ary[0]), :or)

此表单包含所有元素,但第一个元素,并为每个元素添加.or(ary[i])到结果,其中初始值为Object.where(ary[0])

另一种做同样事情的方法是使用一个块:

ary[1..-1].inject(Object.where(ary[0])) { |query, cond| query.or(cond) }