0

美好的一天,我想知道,如果我像这样使用 group_by 进行选择,是否有可能

  @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

尽管我认为 shioyama 的回答可能会对您有所帮助,但我怀疑您是否真的需要排序过程。正如 shio 正确指出的那样,您的 sort_by 的返回值是一个哈希值。那么,您为什么不直接访问想要作为第一个值的值,只需将其用作哈希键?

于 2012-09-04T09:31:33.920 回答