我有两个模型:Playlist
和Item
。我想构建一个查询,该查询返回除具有特定项目的播放列表以外的所有播放列表。
这些是模型:
class Playlist < ApplicationRecord
has_many :items
end
class Item < ApplicationRecord
belongs_to :playlist
end
这是一个无效的查询,因为可能存在具有指定项目的播放列表,但还有多个列表,如果还有其他项目,则将它们包括在内(这是我不想要的): / p>
Playlist.left_outer_joins(:items).where.not(items: { uid: id })
记录下来,我的DBMS是 PostgreSQL 9.6
答案 0 :(得分:2)
也许可以用更好的方式编写,但它应该可以工作:
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 })
答案 1 :(得分:2)
我没有可以快速测试的设置,但是我认为您可以使用Rails ActiveRecord
子查询:
Playlist.where.not(id: Item.select(:pl_id).where(id: id_to_exclude))
在这里,pl_id
是Item
中对应于播放列表ID的属性的名称。我还假设id
是每个表中的主键。这可能是一种紧凑的结果方法,但从查询角度来看可能不是最有效的方法。