class << self
   def category_sort
     order(small_category_id: "asc", id: "asc")
     .group_by { |w| w.small_category.name }
   end
 end

上記の結果は下記のようなハッシュになります。

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

big_categoryがあるので、各big_categoryに関連するsmall_categoryをぶら下げたいと思っているのですが、どのようにプログラムを書いていいのかわかりません。

結果下記のようなイメージでデータを取りたいです。small_category1とsmall_category2はbig_category1にぶら下がっていて、small_category1とsmall_category2は各関連するデータを持っているようなイメージです。

 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