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



我有一个这样的散列(它是group_by方法的结果):

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

我需要对它进行排序,使nil元素成为第一个,然后是所有其他ActiveRecord对象。我该怎么做?Thanx

p.S.

  1. 是的,我需要一个ActiveRecord对象作为键(而不是符号或其他一些)
  2. 由于复杂的SQL请求,我无法在数据库中执行订单

我只需要按键对散列进行排序。

您不能对哈希进行排序,但是:

哈希按插入相应键的顺序枚举它们的值。

要在开始时获得特定的密钥,只需确保先插入即可。这里有一个例子:

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]}

假设您在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实例)

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

最新更新