我有一个表格,标签,有一列" parent_id"表示标签是否是另一个的子类别。并非所有标签都有父类别。
class Tag < ActiveRecord::Base
has_many :subcategories, :class_name => "Tag", :foreign_key => "parent_id", :dependent => :destroy
belongs_to :parent_category, :class_name => "Tag"
end
我知道如何使用范围获取拥有父类别的标记:
scope :with_parent, -> {includes(:subcategories).where("parent_id IS NOT NULL")}
然后在我的模型中创建一个调用Tag.with_parent.to_a
的方法,该方法返回以下内容:
[#<Tag id: 78, tag: "FirstChildTag", parent_id: 77>, #<Tag id: 79, tag: "SecondChildTag", parent_id: 77>, #<Tag id: 80, tag: "ThirdChildTag", parent_id: 20>]
我知道这是一个简单的问题,但如何为 父类别的代码创建范围?所以,在这种情况下,我想返回id =&#34; 77&#34;和&#34; 20&#34;,因为它们是父类别。
答案 0 :(得分:0)
父类别不会有parent_id = NULL
吗?所以你可以查询。但是,这可能会导致误报,因为您说并非所有类别都有父类别,因此这些类别将NULL
并包含在您的数据集中。
答案 1 :(得分:0)
如果您不仅需要根,而且还需要嵌套的父母&#39;以及那里&#39;表中没有多少标签 - 试试
scope :parents, ->{ where(id: where.not(parent_id:nil).ids) }
(如果表很大,这是非常低效的)
但实际上,让一个有孩子的字段计数并使用counter_cache会更好:
belongs_to :parent_category, :class_name => "Tag", counter_cache: :children_count
scope :parents, ->{ where(arel_table[:children_count].gt(0))}
记得在添加后重置计数器
同样在这种情况下,您可以拥有真正的根源&#39;在parent_id为空的附加过滤范围