Rails一对多查询问题

时间:2011-09-01 15:01:02

标签: ruby-on-rails

我觉得我在这里遗漏了一些明显的东西,所以希望有人可以帮助我。

假设我有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,但看起来我错了。

还有另一种方法可以实现这一点,还是有一些我想念的简单? 谢谢您的帮助!

1 个答案:

答案 0 :(得分:1)

使用includes代替joins尝试相同的查询。

books.id永远不会是NULL,因为您要求提供属于书架的书籍。 joins只会为您提供设置关联的记录,因此您要求提供ID为NULLNOT NULL的图书。

This answer可能会对这两种方法之间的差异有所了解。