【问题标题】:Rails: How to sort/re-order an OrderedHashRails:如何对 OrderedHash 进行排序/重新排序
【发布时间】:2011-05-18 01:58:33
【问题描述】:

我有一个 OrderedHash,由答案 here 生成,如下所示:

<OrderedHash {2=>"534.45",7=>"10",153=>"85.0"}>

所以,我需要按第二个值对哈希进行降序排序。我试过这个:

var.sort! {|a,b| b[1] <=> a[1]}
NoMethodError: undefined method `sort!' for #<ActiveSupport::OrderedHash:0x127a50848>

如何重新排序这个 OrderedHash?

【问题讨论】:

  • @Shtéf 的回答对我来说看起来不错,但我可以建议将 ruby​​ 视为 ruby​​ 而不是其他语言吗?很容易认为您正在尝试使 ruby​​ 看起来像 php,这将是不幸的。或许您可以解释一下您希望下次实现的目标。

标签: ruby-on-rails sorting hash


【解决方案1】:

好吧,我认为您可以在原始答案的sum 调用中简单地使用:order =&gt; 'sum_deal_price ASC'

但是你也可以用 Ruby 来做,只是有点棘手:

# You can't sort a Hash directly, so turn it into an Array.
arr = var.to_a  # => [[2, "534.45"], [7, "10"], [153, "85.0"]]
# Looks like there's a bunch of floats-as-strings in there, fix that.
arr.map! { |pair| [pair.first, pair.second.to_f] }
# Now sort it by the value (which is the second entry of the pair).
arr.sort! { |a, b| a.second <=> b.second }
# Turn it back into an OrderedHash.
sorted_hash = ActiveSupport::OrderedHash[arr]

【讨论】:

  • deal.price 的订单似乎不起作用。与结果集相比,我得到的结果遍布地图。使用您的第二个建议有效(除了排序!,我不得不使用 {|a,b| b[1] a[1]} ),但我担心时间。我正在查看 80,000 条记录,并且来回转换它们需要相当长的时间。
  • 哎呀,好消息。修复了排序调用。我不确定这是否可行,但你可以试试:order =&gt; 'sum_deal_price' 吗? (或在日志中检查为 SUM 结果列分配的别名。)
  • 做到了。我只需一条 sql 语句就可以返回我需要的值。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-10
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多