儿童存在于铁路中的父母记录的范围4

时间:2015-11-16 18:57:31

标签: sql ruby-on-rails postgresql ruby-on-rails-4 activerecord

我有一个表格,标签,有一列" 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;,因为它们是父类别。

2 个答案:

答案 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为空的附加过滤范围