从数据库中检索对象(高级数组条件)

我有一个模型,其中标签通过Tagrelationships与其他标签连接。 某个标签可能有一个父标签和几个子标签。 这是标签模型:

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查询中选择没有任何父元素的标记。

这是一个可能符合您要求的替代建议。

不是创建单独的关系类,而是通过向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的标签。

希望有所帮助。