Rails重构代码,用于迭代自引用结构

时间:2014-07-10 13:47:26

标签: ruby-on-rails

我在rails项目中有一个“groups”表。每个组都可以有一个父组,其中group_id引用它自己的表。

我有这个代码来遍历行并使用代数组装一个数组,这是有效的,但我认为必须有一个更有效的方法来实现这一点,使用更少的代码行,或者只有一个ActiveRecord查找,或者只是一般的简单...任何想法?

class GroupsController < ApplicationController

  def index
    root_groups = Group.where 'group_id is null'
    @child_groups = Group.where 'group_id is not null'
    @groups = []

    root_groups.each do |group|
      @groups << [group, 0]
      find_children group, 1
    end
  end

  private

    def find_children (group, generation)
      @child_groups.each do |child|
        if child.group == group
          @groups << [child, generation] 
          find_children child, generation+1
        end
      end
    end

end

2 个答案:

答案 0 :(得分:0)

我有similar situation a few years ago并使用连接表来管理关系。但是,我也在我的自引用方法中使用了collect,这表明你应该能够这样做:

def find_children(group, generation)
  group.collect{|g| [[g, generation] << find_children(g, generation+1)}.uniq
end

我还建议你将这个逻辑移到模型中。

答案 1 :(得分:0)

您还可以查看awesome_nested_set,它将为您完成大量此项工作