Rails 5:如果结果与特定记录相关联,则将其排除在查询中

时间:2019-01-15 16:00:31

标签: sql ruby-on-rails postgresql activerecord

我有两个模型:PlaylistItem。我想构建一个查询,该查询返回除具有特定项目的播放列表以外的所有播放列表。

这些是模型:

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

2 个答案:

答案 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 })

概念与此类似:https://stackoverflow.com/a/2686266

答案 1 :(得分:2)

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

Playlist.where.not(id: Item.select(:pl_id).where(id: id_to_exclude))

在这里,pl_idItem中对应于播放列表ID的属性的名称。我还假设id是每个表中的主键。这可能是一种紧凑的结果方法,但从查询角度来看可能不是最有效的方法。