Ruby on rails 具有嵌套对象的ActiveRecord作用域

Ruby on rails 具有嵌套对象的ActiveRecord作用域,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我不确定我是否只是没有搜索正确的东西,但我希望设置一个范围,然后用作选择框的集合 笔记本电脑型号: class Notebook < ActiveRecord::Base has_many :notes end 缩小范围,以便用户只能从不包含任何注释的下拉式笔记本中选择注释类型为检查列表。我只是不确定我应该在哪里对每个注释进行迭代,以确定它的父笔记本是否可以包含在集合中 编辑 目前,我有4个笔记本记录。在四条记录中,只有一条记录包含“检查列表”注释类型的注释。该笔记本总共包含两个笔记

我不确定我是否只是没有搜索正确的东西,但我希望设置一个范围,然后用作选择框的集合

笔记本电脑型号:

class Notebook < ActiveRecord::Base
  has_many :notes
end
缩小范围,以便用户只能从不包含任何
注释的下拉式笔记本中选择
注释类型
检查列表
。我只是不确定我应该在哪里对每个
注释进行迭代,以确定它的父
笔记本
是否可以包含在集合中

编辑
目前,我有4个
笔记本
记录。在四条记录中,只有一条记录包含“检查列表”注释类型的注释。该笔记本总共包含两个笔记,其中只有一个笔记类型为
检查列表
。因为这是真的,所以我想将整个笔记本从范围中排除,而不考虑笔记本中的其他注释

感谢您的帮助。

使用:

使用:


我想这真的很接近。然而,实际上,我用它得到的记录比数据库中的总数还要多。例如,我总共有4个笔记本对象,其中只有一个包含带有检查列表的便笺。这将返回所有四条记录,以及第三条记录的副本。我正在做更多的调查,但想感谢您至少让我了解了这段代码。如果我使用
连接(:notes)。其中(notes:{note\u type:'check\u list')
,我得到了包含检查列表的一条记录,因此这与预期相反。@jeepagooster我已经编辑了答案,注意
部分。如果有效(它将100%)确保接受答案(在答案分数附近寻找复选标记)嗯,这有助于消除重复记录,但仍然列出了所有笔记本,包括带有
注释的
笔记本
,注释类型为
检查列表
。在控制台中,我可以做
Notebook.notes\u而不必检查列表。last.notes.last.note\u键入
并返回
check\u list
@jeepagooster这是不可能的,如果使用
where.not
我认为这非常接近。然而,实际上,我用它得到的记录比数据库中的总数还要多。例如,我总共有4个笔记本对象,其中只有一个包含带有检查列表的便笺。这将返回所有四条记录,以及第三条记录的副本。我正在做更多的调查,但想感谢您至少让我了解了这段代码。如果我使用
连接(:notes)。其中(notes:{note\u type:'check\u list')
,我得到了包含检查列表的一条记录,因此这与预期相反。@jeepagooster我已经编辑了答案,注意
部分。如果有效(它将100%)确保接受答案(在答案分数附近寻找复选标记)嗯,这有助于消除重复记录,但仍然列出了所有笔记本,包括带有
注释的
笔记本
,注释类型为
检查列表
。在控制台中,我可以执行
Notebook.notes\u而不必检查列表。last.notes.last.note\u键入
并返回
检查列表
@jeepagooster如果使用
where.not
class Note < ActiveRecord::Base
  belongs_to :notebook
end
Notebooks.notes_without_check_lists
class Notebook < ActiveRecord::Base
  has_many :notes
  scope :notes_without_check_lists, -> { joins(:notes).where.not(notes: { note_type: 'check_list' }).group('notebooks.id') }
end
class Notebook < ActiveRecord::Base
  has_many :notes

  def self.notes_without_check_lists
    all.reject { |notebook| notebook.notes.any? { |note| note.note_type == 'check_list' } }
  end
end