2011-02-11 66 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}}}