Sql Rails 5:如果结果为';与特定记录重新关联

Sql Rails 5:如果结果为';与特定记录重新关联,sql,ruby-on-rails,postgresql,activerecord,Sql,Ruby On Rails,Postgresql,Activerecord,我有两种型号:Playlist和Item。我想建立一个查询,返回所有的播放列表,除了那些有一个特定的项目 这些是模型: class Playlist < ApplicationRecord has_many :items end class Item < ApplicationRecord belongs_to :playlist end class Playlist

我有两种型号:
Playlist
Item
。我想建立一个查询,返回所有的播放列表,除了那些有一个特定的项目

这些是模型:

class Playlist < ApplicationRecord
  has_many :items
end

class Item < ApplicationRecord
  belongs_to :playlist
end
class Playlist
这是一个不起作用的查询,因为可能有包含指定项的播放列表,但也有多个,如果有其他项,则会包含这些项(这是我不想要的):

Playlist.left\u outer\u连接(: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 })

这个概念与此类似:

我没有快速测试的设置,但我认为您可以使用Rails
ActiveRecord
子查询:

Playlist.where.not(id: Item.select(:pl_id).where(id: id_to_exclude))
这里,
pl\u id
是与播放列表id相对应的
Item
中属性的名称。我还假设
id
是每个表中的主键。对于结果来说,这可能是一种紧凑的方法,但从查询的角度来看,可能不是最有效的方法