ruby-on-rails - 查找关联不存在的记录
问题描述
如何仅获取电子书模型中未关联的记录?简单地说,我只想提供用户还没有的电子书。我尝试了很多解决方案,最好的解决方案之一是:
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 和关联来执行此操作
解决方案
你想用 aleft_outer_join
代替。
Magazine.left_outer_joins(:ebooks).where(ebooks: { id: nil })
推荐阅读
- c++ - 两个类之间的共享方法
- keras - 训练具有可变数量特征的 Keras LSTM 模型
- parquet - AWS Glue 作业:命令失败,错误代码为 1
- reactjs - React Admin,为 List 定义自定义 saga
- android - 在手机关闭时根据特定短信运行警报
- html - 垂直居中对齐的图像更靠近底部而不是顶部
- spring - Spring Boot 无法使用抽象和接口自动装配组件
- ios - 获取拖动预览的帧
- sparql - SPARQL:DISTINCT 关键字不适用于 VALUES
- c# - Mvvmcross Android - recyclerview 自定义适配器在滚动时抛出错误