首页 > 解决方案 > 查找关联不存在的记录

问题描述

如何仅获取电子书模型中未关联的记录?简单地说,我只想提供用户还没有的电子书。我尝试了很多解决方案,最好的解决方案之一是:

Magazine.left_joins(:ebooks).where(ebooks: { id: nil })

但我不知道在哪里指定 user_id

model Magazine
  has_many :ebooks
  has_many :users, :through => :ebook

model Ebook
  belongs_to :user
  belongs_to :magazine

model User
  has_many :ebooks

我是 Rails 的新手,可能对愚蠢的问题感到抱歉。

@哈斯

谢谢,但这会生成这样的sql:

SELECT "magazines".* FROM "magazines" 
INNER JOIN "ebooks" ON "magazines"."id" = "ebooks"."magazine_id" 
LEFT OUTER JOIN "ebooks" "ebooks_magazines" ON "ebooks_magazines"."magazine_id" = "magazines"."id" 
WHERE "ebooks"."user_id" = 1 AND "ebooks"."id" IS NULL 

(WHERE "ebooks"."user_id" = 1 => 这将返回 0 条记录,因为 where 过滤器在表 ebooks 中找不到任何行)

但我需要这样的东西:

SELECT "magazines".*, ebooks.user_id FROM "magazines" 
LEFT JOIN "ebooks" ON "magazines"."id" = "ebooks"."magazine_id" AND ebooks.user_id = 1
LEFT OUTER JOIN "ebooks" "ebooks_magazines" ON "ebooks_magazines"."magazine_id" = "magazines"."id" 
WHERE ebooks.user_id IS NULL

这将返回我正在寻找的行,但我不知道如何使用 rais 和关联来执行此操作

标签: ruby-on-rails

解决方案


你想用 aleft_outer_join代替。

Magazine.left_outer_joins(:ebooks).where(ebooks: { id: nil })

推荐阅读