通过ruby中的排序值对哈希进行排序的最佳方法?

时间:2014-05-15 16:47:21

标签: ruby-on-rails ruby sorting activerecord hash

目前,我有一系列具有不同状态的礼品卡。由于逻辑复杂,这些状态不会持久存在于对象上。我的目标是按照他们的状态订购这些礼品卡。这是我目前的实施:

  @gift_cards.sort! do |a, b|
    comp = gc_sort_order[a.status] <=> gc_sort_order[b.status]
    comp.zero?? (b.expiration_date <=> a.expiration_date) : comp
  end

GiftCard#status返回已过期已兑换或已有效。他们的重量&#39;由这样定义的gc_sort_order确定:

def gc_sort_order
  {
    active: 1,
    redeemed: 2,
    expired: 3
  }
end

然而,这看起来非常笨重,而且我想重构它,但还没有找到更好的解决方案。任何意见都将不胜感激。

2 个答案:

答案 0 :(得分:0)

试试这个:

@gift_cards.sort_by! { |gc| [-gc_sort_order[gc.status], gc.expiration_date] }.reverse

答案 1 :(得分:0)

class Reverser
  attr_reader :v

  def initialize(v)
    @v = v
  end

  def self.[](v)
    new(v)
  end

  def <=>(other)
    other.v <=> @v
  end
end

# status ASC, expiration_date DESC
@gift_cards.sort_by! { |gc| [ gc_sort_order[gc.status], 
                              Reverser[gc.expiration_date] ] }