こんにちは。
@p = Performance.includes(place: [:category]).
order("places.title ASC").
group_by{|p| p.place.category}
特定のカテゴリを最初にしたい場合は、どうすればよいですか?
EDIT 1
@p.each do |p| による結果の解析を表示します。
こんにちは。
@p = Performance.includes(place: [:category]).
order("places.title ASC").
group_by{|p| p.place.category}
特定のカテゴリを最初にしたい場合は、どうすればよいですか?
EDIT 1
@p.each do |p| による結果の解析を表示します。
の戻り値group_by
は単なる通常のハッシュであるため、それを適用sort_by
して目的のカテゴリを最初に配置できます。
group_by { |p| p.place.category }.sort_by { |k,v| (k=="category name") ? "" : k }
category name
優先順位を付けたいカテゴリの名前です (空の文字列を指定すると、並べ替え結果で最初に表示され、それ以外はすべてアルファベット順に並べ替えられます) 。
これにより、ハッシュが配列に変換されます。データをハッシュ形式で保持する場合は、結果を次のようにラップしHash[...]
ます。
Hash[group_by { |p| p.place.category }.sort_by { |k,v| (k=="category name") ? "" : k }]
ハッシュのソートに関するこの記事も参照してください: http://www.rubyinside.com/how-to/ruby-sort-hash
更新:
ソートに代わる、プロセッサへの負荷がわずかに少ない方法:
grouped = group_by { |p| p.place.category }
Hash[*grouped.assoc("category name")].merge(grouped.except("category name"))
これを行うにはもっと簡単な方法があるかもしれませんが、基本的にこれは「カテゴリ名」のキーと値をハッシュの先頭に追加します。
塩山の回答は参考になると思いますが、ソートプロセスが本当に必要かどうかは疑問です。shio が正しく述べているように、sort_by の戻り値はハッシュです。それでは、ハッシュキーとして使用するだけで、最初の値として必要な値にアクセスしないのはなぜですか?