Ruby on rails Rails一对多查询问题

Ruby on rails Rails一对多查询问题,ruby-on-rails,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 我不需要这是非常有效的,但我想让它从可怕的低效率。更具体地说,如果

我觉得我错过了一些明显的东西,所以希望有人能帮我

假设我有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...>
Shelf.joins(:books).where(“books.id为NULL”).where(:building\u id=>building\u id)
然而,这个查询并没有给出我期望的结果(当我知道一些书架是空的时,它不会返回任何书架)。我本来希望join会为一个没有书的书架的books.id列填充NULL,但似乎我错了

有没有其他方法来实现这一点,或者有什么简单的东西我错过了?
谢谢你的帮助

使用
包含
而不是
连接尝试相同的查询

books.id
不能为
NULL
,因为您要求的是属于书架的书籍
joins
只会给你设置关联的记录,所以你要的是id都是
NULL
notnull
的书


可能会对这两种方法之间的差异有所帮助。

您是否用
包含
而不是
连接来尝试它?哇,很有趣。这似乎是正确的。很明显,includes的工作方式有一部分是我没有意识到的。我认为includes更多的是为了急切地加载关联,而join是为了查询关联的属性。不管是哪种方式,把它放在一个答案中,得到你应得的代表:)我对
包含
连接
之间的区别也有点模糊,但我知道它适用于你想要关联和不关联记录的情况。好东西。我并没有想到,join只返回已填充关联的记录,但这肯定是有道理的。我也不认为我曾经尝试过在查询中使用“includes”来包含我的关联属性,但是现在想想,这当然是有道理的。谢谢你的澄清。