2016-04-03 69 views
0

我有一個團隊模型,有兩個屬性,.type.sub typeRails group by第一列,然後第二列

我想通過team.type先打電話再打team.subtype

我試圖

Team.all.group_by{|e| [e.type, e.sub_type]} 

但是,這讓我

{ 
    ["Sport", "Football"] => [ 
          teamObject, 
          teamObject 
          ], 
    ["Sport", "Soccer"] => [ 
          teamObject, 
          teamObject 
          ], 
} 

我要的是....

{ 
"Sport" => { 
       "Football" => [ 
           teamObject, 
           teamObject 
          ], 
       "Soccer" => [ 
          teamObject, 
          teamObject 
          ], 
      }, 
"Drama" => { 
       "Band" => [ teamObject, teamObject], 
       "Dance" => [ teamObject, teamObject], 
      },   
} 

應該怎樣處理我的查詢或過濾器是什麼樣子?理想情況下,我想把它變成一個範圍。

注意:我不想創建更多模型,表格或關係。

回答

1

我會嘗試這樣的事:

Team.all. 
    group_by { |e| e.type }. 
    map { |k, v| [k, v.group_by { |e| e.sub_type }].to_h } 

或者:

Hash.new { |h, k| h[k] = Hash.new { |h, k| h[k] = [] } }.tap do |hash| 
    Team.all.each { |t| hash[t.type][t.sub_type] << t } 
end 
+0

謝謝。我使用了Team.all.group_by {| e | e.type} .map {| k,v | {k => v.group_by {| e | e.sub_type}}}。我如何寫作範圍? – MicFin

+0

你不能把它寫成範圍。 Rails中的作用域對'ActiveRecord :: Relation'對象起作用,並且應該生成針對數據庫運行的SQL查詢。但是在從數據庫收到數據之後,在結果數組上調用'group_by'方法。您必須首先從數據庫加載數據,然後才能使用此方法進行分組。你可以在Array上編寫你自己的'nested_group_by'方法... – spickermann

相關問題