美好的一天,我想知道,如果我像这样使用 group_by 进行选择,是否有可能
@p = Performance.includes(place: [:category]).
order("places.title ASC").
group_by{|p| p.place.category}
因此,如果我希望某个特定类别排在第一位,我该怎么办?
EDIT 1
查看@p.each 对结果进行的解析 do |p|
美好的一天,我想知道,如果我像这样使用 group_by 进行选择,是否有可能
@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"))
可能有一种更简单的方法可以做到这一点,但基本上这会将“类别名称”的键和值添加到哈希的头部。
尽管我认为 shioyama 的回答可能会对您有所帮助,但我怀疑您是否真的需要排序过程。正如 shio 正确指出的那样,您的 sort_by 的返回值是一个哈希值。那么,您为什么不直接访问想要作为第一个值的值,只需将其用作哈希键?