我觉得我在这里遗漏了一些明显的东西,所以希望有人可以帮助我。
假设我有3种型号:建筑物,货架和书籍。
我想解决的问题是拆除所有没有书籍的书架。
基本结构如下:
class Building
has_many :shelves
end
class Shelf
has_many :books
belongs_to :building
end
class Book
belongs_to :shelf
end
我不需要这样做非常有效,但我确实希望防止它变得非常低效。更具体地说,如果我有一个需要删除空架子的建筑物,这就是我一直试图找到的空架子:
Shelf.joins(:books).where("books.id is NULL").where(:building_id => building_id)<other_conditions...>
然而,这个查询并没有给我我期望的结果(当我知道有些是空的时候它没有返回任何架子)。我希望对于没有书籍的书架的books.id栏,联接会填写NULL,但看起来我错了。
还有另一种方法可以实现这一点,还是有一些我想念的简单? 谢谢您的帮助!
答案 0 :(得分:1)
使用includes
代替joins
尝试相同的查询。
books.id
永远不会是NULL
,因为您要求提供属于书架的书籍。 joins
只会为您提供设置关联的记录,因此您要求提供ID为NULL
和NOT NULL
的图书。
This answer可能会对这两种方法之间的差异有所了解。