2011-02-11 65 views
2

深分组所以,我有记录的阵列和我想组2级2水平在红宝石

基本上我想group_by{|x| x.field1 }然后在散列每个值由FIELD2被进一步分组英寸有效地导致我可以倾倒出一棵树。

def treemaker(array = []) 
    tree = ledgers.group_by{|x|x.master_group} 
    tree.each{|x,z| tree[x] = z.group_by{|y| y.account_group}} 
    tree 
end 

我会那么,我可以放到一个“树”的JavaScript插件的方式渲染树。

有没有更高效的方法?

样品输入:ActiveRecord对象的数组,其中模型包含,田野master_group,ACCOUNT_GROUP和名称

Class MyModel < ActiveRecord::Base 
    validates :master_group, :account_group, :name, :presence => true 
end 

样品输出继电器:

{"master_group1" => {"account_group1" => ["name1","name2",...], 
        "account_groupx" => ["name3", "name4",...], 
        ....}, 
"master_group2" => {"account_group2" => ["namex", "namey"]}, 
... 
} 

我不是专门找一个“ SQL分组“解决方案(但那也不错)。只是一个使用任何给定的红宝石对象列表枚举的解决方案。

+2

请提供样本输入和所需的输出。 – Phrogz 2011-02-11 14:32:25

回答

3

@xaxxon让我以正确的方式思考“散列的默认值”路径。

我想我现在可以添加一个方法到我的模型中,我可以使用各种各样的范围和结束树在结束树模式下得到我的模型。

class MyModel < ActiveRecord::Base 

    validates :master_group, :account_group, :name, :presence => true 
    def self.tree(field1 = 'master_group', field2 = 'account_group') 
    tree = Hash.new{|hash,key| hash[key] = Hash.new{|h,k| h[k] = []}} 
    all.each do |item| 
     tree[item.send('field1')][item.send('field2')].push(item) 
    end 
    tree # bob's your uncle! 
    end 

end 

MyModel.recent.tree => Hash of Hash of arrays 
1

设置一些假的数据

富= [{:A => 1,B => 2},{:A => 3,A:B => 4}]

设置的输出数据结构

树= {}

填充输出数据结构 - 这是怪异因为你必须填充不存在的哈希,因此|| = {}的东西。

foo.each {| thing | (树[事情[:A]] || = {})[事情[:B]] =的事情}

看起来不错..:一个是你的主人组:b为您ACCOUNT_GROUP

PP树

{1 => {2 => {:A => 1,b => 2}},3 => {4 => {:A => 3,A:b => 4}}}