合并两个活动记录查询的结果

时间:2014-12-04 00:06:29

标签: sql ruby-on-rails

我想合并以下查询的结果:

Dispenser.includes(:reviews).where.not(reviews: { id: nil })

Dispenser.includes(:dispenser_reviews).where.not(dispenser_reviews: { id: nil })

我试过在这两个查询的中间放置一个||,但这并没有给出预期的结果。我想找到所有带reviewdispenser_review ..

的掌柜

所以,让我们说每个查询都有以下分配器ID:

[1, 2, 3][2, 3, 4] ..

输出应该是由ids [1, 2, 3, 4]

表示的分配器

3 个答案:

答案 0 :(得分:2)

您可以使用https://github.com/activerecord-hackery/squeel而非活动记录来完成此操作。它提供了Arel没有开箱即用的更高级的功能。

话虽这么说,你的逻辑会非常讨厌。如果您想获得结果集,并且您没有考虑两个查询而不是一个查询,我只是将{2}结果加入+运算符。

r1 = Dispenser.includes(:reviews)# ...
r2 = Dispenser.includes(:dispenser_reviews)# ...
result = r1 + r2

至于一个吱吱作响的例子,它就像是:

Dispenser.includes{reviews}.
  includes{dispenser_reviews}.
  where{(reviews.id.not_eq nil) | {dispenser_reviews.id.not_eq nil)}.
  references(:all)

答案 1 :(得分:1)

联接将执行INNER JOIN并且仅返回具有评论或dispenser_reviews的分配器对象。管道' |'将摆脱重复。

Dispenser.joins(:reviews) | Dispenser.joins(:dispenser_reviews)

或获取ID

Dispenser.joins(:reviews).pluck(:id) | Dispenser.joins(:dispenser_reviews).pluck(:id)

答案 2 :(得分:0)

您也可以使用arel并将两个查询合并为一个:

Dispenser.includes(:reviews, :dispenser_reviews).where((Review.arel_table[:id].not_eq(nil)).or DispenserReview.arel_table[:id].not_eq(nil)).references(:reviews, :dispenser_reviews)