美好的一天,我想知道,如果我像group_by一样选择
,是否可能 @p = Performance.includes(place: [:category]).
order("places.title ASC").
group_by{|p| p.place.category}
所以如果我想要一个特定的类别成为第一个,我该怎么做?
EDIT 1
在视图中解析@p.each do | p |的结果
答案 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的返回值是一个哈希值。那你为什么不直接访问你想要作为第一个值的值,只需将它作为哈希键使用?