[英]Rails 5: Query which excludes results if they're associated with a specific record
我有兩個模型: Playlist
和Item
。 我想建立一個查詢,該查詢返回除具有特定項目的播放列表以外的所有播放列表。
這些是模型:
class Playlist < ApplicationRecord
has_many :items
end
class Item < ApplicationRecord
belongs_to :playlist
end
這是一個無效的查詢,因為可能存在具有指定項目的播放列表,但還有多個列表,如果還有其他項目,則將它們包括在內(這是我不想要的):
Playlist.left_outer_joins(:items).where.not(items: { uid: id })
作為記錄,我的DBMS是PostgreSQL 9.6
也許可以用更好的方式編寫它,但是它應該可以工作:
join_sql = Arel.sql(
"LEFT OUTER JOIN items ON " \
"(items.playlist_id = playlists.uid " \
"AND items.some_id = '#{item.some_id}')"
)
Playlist.where(owner: owner)
.joins(join_sql)
.where(items: { playlist_id: nil })
這個概念與此類似: https : //stackoverflow.com/a/2686266
我沒有設置可以快速測試此設置,但是我認為您可以使用Rails ActiveRecord
子查詢:
Playlist.where.not(id: Item.select(:pl_id).where(id: id_to_exclude))
在此, pl_id
是Item
與播放列表ID對應的屬性名稱。 我還假設id
是每個表中的主鍵。 這可能是一種緊湊的結果方法,但從查詢角度來看可能不是最有效的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.