[英]Merge the results of two active record queries
我想合並以下查詢的結果:
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]
..
輸出應為ID [1, 2, 3, 4]
代表的分配器
您可以使用https://github.com/activerecord-hackery/squeel而非活動記錄來實現。 它提供了Arel尚未提供的更高級的功能。
話雖這么說,你的邏輯會很討厭。 如果您想獲取結果集,並且您不介意兩個查詢而不是一個查詢,那么我只需將兩個結果與+
運算符連接在一起。
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)
聯接將執行“內部聯接”,並且僅返回具有評論或分配器評論的分配器對象。 管道'|' 將擺脫愚蠢。
Dispenser.joins(:reviews) | Dispenser.joins(:dispenser_reviews)
或獲取ID
Dispenser.joins(:reviews).pluck(:id) | Dispenser.joins(:dispenser_reviews).pluck(:id)
您還可以使用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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.