我不确定我是不是在搜索正确的内容,但我希望设置一个范围,然后将其用作选择框的集合。
笔记本型号:
class Notebook < ActiveRecord::Base
has_many :notes
end
注意型号:
class Note < ActiveRecord::Base
belongs_to :notebook
end
我在笔记上有几个属性,重要属性(为此)为note_type
。目前,note_type可以是check_list
,text
或bookmark
。
我的目标是让这样的工作:
Notebooks.notes_without_check_lists
缩小范围,以便用户只能 从下拉列表中选择不包含任何notes
且note_type
为check_list
的笔记本。我不确定我应该在每个note
上进行迭代,以确定它的父notebook
是否可以包含在集合中。
修改
目前,我有4条Notebook
条记录。在四个记录中,只有一个包含注释类型为check_list的注释。该笔记本总共包含两个注释,其中只有一个注释类型为check_list
。因为这是真的,我想从示波器中排除整个笔记本,无论笔记本中的其他笔记如何。
当然感谢任何帮助。
答案 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