0

こんにちは。

  @p = Performance.includes(place: [:category]).
  order("places.title ASC").
  group_by{|p| p.place.category}

特定のカテゴリを最初にしたい場合は、どうすればよいですか?

EDIT 1

@p.each do |p| による結果の解析を表示します。

4

2 に答える 2

2

の戻り値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"))

これを行うにはもっと簡単な方法があるかもしれませんが、基本的にこれは「カテゴリ名」のキーと値をハッシュの先頭に追加します。

于 2012-09-04T07:25:43.373 に答える
0

塩山の回答は参考になると思いますが、ソートプロセスが本当に必要かどうかは疑問です。shio が正しく述べているように、sort_by の戻り値はハッシュです。それでは、ハッシュキーとして使用するだけで、最初の値として必要な値にアクセスしないのはなぜですか?

于 2012-09-04T09:31:33.920 に答える