【问题标题】:Set first group of group_by?设置第一组 group_by?
【发布时间】:2012-08-28 18:59:57
【问题描述】:

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

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

所以如果我希望某个特定类别成为第一,我该怎么办?

EDIT 1

通过@p.each 对结果进行解析查看|p|

【问题讨论】:

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


【解决方案1】:

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"))

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • in view a parse through the results by @p.each do |p|
    • 我同意应该有更好的方法来做到这一点。我已经发布了一个替代方案,它只是将所需的类别组添加到哈希的前面作为替代方案。
    猜你喜欢
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 2017-08-10
    • 2018-10-03
    • 1970-01-01
    • 2014-12-12
    相关资源
    最近更新 更多