我有一个模型,其中标签通过Tagrelationships与其他标签连接。某个标签可能有一个父标签和几个子标签。 这是Tag-model:
has_many :tagrelationships, :foreign_key => "parent_id",
:dependent => :destroy
has_many :children, :through => :tagrelationships,
:source => :child
has_one :reverse_tagrelationship, :foreign_key => "child_id",
:class_name => "Tagrelationship",
:dependent => :destroy
has_one :parent, :through => :reverse_tagrelationship,
:source => :parent
Tagrelationship模型:
belongs_to :child, :class_name => "Tag"
belongs_to :parent, :class_name => "Tag"
数据库结构: 标签包含以下列:id,name,user_id,created_at,updated_at tagrelationships有列:id,parent_id,child_id,created_at,updated_at
我无法找到如何选择没有任何父标签的标签。当然,可以选择某个用户的所有标签并在循环中评估这些标签:
@tags = Tag.where(:user_id => current_user)
@tags.each do |f|
if f.parent.nil?
@roottags << f
end
end
数组@roottags包含我正在寻找的元素。 我确信在一个sql查询中没有任何父元素的选择是一种更简单的方法。
答案 0 :(得分:1)
这是一个可能符合您要求的替代建议。
不是创建单独的关系类,而是通过向Tag类添加parent_id来执行自联接。
这通过以下方式简化了关系:
class Tag < ActiveRecord::Base
has_many :children, :class_name => "Tag", :foreign_key => "parent_id"
belongs_to :parent, :class_name => "Tag"
scope :top_level, where(:parent_id => nil)
end
现在,当您想要找到没有任何父级的标签(即顶级标签)时,您可以使用命名范围过滤具有父ID的标签。
希望有所帮助。