我有一个运行条件的函数,其中查询使用哈希来链接带有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或块,但我不确定如何实现它。
答案 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) }