目前,我有一系列具有不同状态的礼品卡。由于逻辑复杂,这些状态不会持久存在于对象上。我的目标是按照他们的状态订购这些礼品卡。这是我目前的实施:
@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
然而,这看起来非常笨重,而且我想重构它,但还没有找到更好的解决方案。任何意见都将不胜感激。
答案 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] ] }