设置第一组group_by?

时间:2012-09-04 06:40:29

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

美好的一天,我想知道,如果我像group_by一样选择

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

所以如果我想要一个特定的类别成为第一个,我该怎么做?

EDIT 1

在视图中解析@p.each do | p |的结果

2 个答案:

答案 0 :(得分: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"))

可能有一种更简单的方法可以做到这一点,但基本上这会将“类别名称”的键和值添加到哈希的头部。

答案 1 :(得分:0)

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