我想合并以下查询的结果:
Dispenser.includes(:reviews).where.not(reviews: { id: nil })
和
Dispenser.includes(:dispenser_reviews).where.not(dispenser_reviews: { id: nil })
我试过在这两个查询的中间放置一个||
,但这并没有给出预期的结果。我想找到所有带review
或dispenser_review
..
所以,让我们说每个查询都有以下分配器ID:
[1, 2, 3]
和[2, 3, 4]
..
输出应该是由ids [1, 2, 3, 4]
答案 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)