是否有更好的方法来映射儿童和大孩子的记录?

时间:2012-10-27 17:17:18

标签: ruby-on-rails arrays map collect

我需要收集树中的所有作者:

parent
|
+- child #1
|
+- child #1
|  |
|  +- grand child #1
|  |
|  +- grand child #2
|
+- child #2
...

(原始帖子可以有n个孩子,每个孩子也可以有m个孩子。来自原始帖子的最大深度为2:Post-Child - Grandchild)

Ruby on Rails中收集所有作者的最佳方法是什么(post belongs_to author)?我目前的做法如下,但似乎并不是真正的表现:

def all_authors_in(post)
  @authors = Array.new
  @authors << post.author

  post.children.each do |child|
    @authors << child.author
    child.children.each do |grandchild| 
      @authors << grandchild.author
    end
  end

  @authors.map{|u| u.id}.uniq
end

模型中的一些代码:

class Post < ActiveRecord::Base
  belongs_to :parent, class_name: 'Post'
  has_many :children, foreign_key: :parent_id, class_name: 'Post', :dependent => :destroy
#...
end

由于

1 个答案:

答案 0 :(得分:1)

我假设您正在为Post模型使用单表继承,但您没有说是否推出了自己的版本。我建议使用ancestry gem。然后你可以做这样简单的事情:

@authors = post.subtree.collect(&:author).uniq