使用nil键和数组值对哈希进行排序

时间:2015-02-12 09:05:28

标签: ruby-on-rails ruby sorting hash

我有这样的哈希(它是group_by方法的结果):

{nil => [#<ActiveRecord id ..., ...], #<ActiveRecord ...> => [#<ActiveRecord id ..., ...], ...}

我需要对它进行排序,以便nil元素成为第一个,然后是所有其他ActiveRecord个对象。我怎样才能做到这一点? 感谢名单

P.S。

  1. 是的,我需要一个ActiveRecord对象作为键(不是符号或其他)
  2. 由于复杂的SQL请求,我无法在我的数据库中执行此操作。
  3. 我只需要通过键对哈希进行排序。

2 个答案:

答案 0 :(得分:1)

您无法对哈希值but进行排序:

  

哈希按照插入相应键的顺序枚举其值。

要在开头获取特定密钥,请确保先插入密钥。这是一个例子:

array = [Integer, Range, BasicObject]

hash = array.group_by(&:superclass)
#=> {Numeric=>[Integer], Object=>[Range], nil=>[BasicObject]}

首先获取nil,使用nil密钥和merge!新值创建哈希:

hash = {nil => nil}
hash.merge!(array.group_by(&:superclass))
#=> {nil=>[BasicObject], Numeric=>[Integer], Object=>[Range]}

答案 1 :(得分:0)

假设您的哈希值在h

Hash[h.sort { |a,b| 
  NilClass === a.first ? 
      (NilClass === b.first ? 0 : -1) : 
      (NilClass === b.first ? 1 : a.first <=> b.first) 
}]

在这里,我们明确定义sort函数,它将nil置于前面,然后按键(ActiveRecord实例在您的情况下对其他元素进行本机排序。)

旁注:你总是可以在数据库中进行排序。