簡體   English   中英

合並兩個活動記錄查詢的結果

[英]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 })

我試過簡單地放置|| 在這兩個查詢的中間,但這並不能給出預期的結果。 我想找到一個所有掌櫃reviewdispenser_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM