ActiveRecord使用嵌套对象进行范围设定

时间:2016-11-19 17:20:40

标签: ruby-on-rails activerecord

我不确定我是不是在搜索正确的内容,但我希望设置一个范围,然后将其用作选择框的集合。

笔记本型号:

class Notebook < ActiveRecord::Base
  has_many :notes
end

注意型号:

class Note < ActiveRecord::Base
  belongs_to :notebook
end

我在笔记上有几个属性,重要属性(为此)为note_type。目前,note_type可以是check_listtextbookmark

我的目标是让这样的工作:

Notebooks.notes_without_check_lists

缩小范围,以便用户只能 从下拉列表中选择不包含任何notesnote_typecheck_list的笔记本。我不确定我应该在每个note上进行迭代,以确定它的父notebook是否可以包含在集合中。

修改
目前,我有4条Notebook条记录。在四个记录中,只有一个包含注释类型为check_list的注释。该笔记本总共包含两个注释,其中只有一个注释类型为check_list。因为这是真的,我想从示波器中排除整个笔记本,无论笔记本中的其他笔记如何。

当然感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

使用scope

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

基本上,您执行数据库查询,提取note_type不等于check_list的所有笔记本的笔记。

修改

在您编辑问题之后,这里是使用Ruby的解决方案(效率低notebooks / notes来处理) - 仍然会考虑使用ActiveRecord解决它:

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