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

时间:2011-05-12 14:33:32

标签: ruby-on-rails ruby-on-rails-3

我有一个模型,其中标签通过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查询中没有任何父元素的选择是一种更简单的方法。

1 个答案:

答案 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的标签。

希望有所帮助。