2017-03-25 7 views
1
class << self 
    def category_sort 
    order(small_category_id: "asc", id: "asc") 
    .group_by { |w| w.small_category.name } 
    end 
end 

これは現在のコードなので、このようなハッシュを得ることができます。モデルでgroup_byを2つ使用できますか?

small_category1 => [data1,data2,data3] 
small_category2 => [data4,data5] 
small_category3 => [data6,data7,data8] 

モデルで2つのgroup_byを使用できますか?私はプログラムを書く方法がわかりません。私はbig_categoryを持っていますので、このようなハッシュを作成したいと思います。

big_category1 => small_category1 => [data1,data2,data3] 
       => small_category2 => [data4,data5] 
big_category2 => small_category3 => [data6,data7,data8] 

現在、私はこのような形を得ることができます。

class << self 
    def category_sort 
    r = order(small_category_id: "asc", id: "asc") 
     .group_by { |w| [w.small_category.big_category.name, w.small_category.name] } 

    hash = Hash.new { |h,k| h[k] = {} } 
    r.each do |k, v| 
     hash[k[0]][k[1]] = v 
    end 
    end 
end 

スマートな方法がありますか?

答えて

0

あなたはそれがきれいに見えるように1行で同じロジックを記述したい場合:、

class << self 
    def category_sort 
    order(small_category_id: "asc", id: "asc") 
    .group_by { |w| [w.small_category.big_category.name, w.small_category.name] } 
    .each_with_object(Hash.new { |h,k| h[k] = {} }) {|(k,v),h| h[k.first][k.last] = v} 
    end 
end 
0

ねえ、あなたがこの方法を試すことができます

class << self 
    def category_sort 
    r = order(small_category_id: "asc", id: "asc").group_by { |w| [w.small_category.big_category.name, w.small_category.name] }.map{|key, value| {key.first => {key.last => value}}}.map(&:to_a).reduce(:concat).to_h 
    end 
end 
関連する問題