有没有办法按单个类型对具有多个属性类型的对象进行排序?

时间:2016-04-07 18:19:00

标签: mysql ruby-on-rails ruby activerecord

我有一个具有以下属性的动物模型。

name: string
sex: string
acquired_at: datetime
fed_at: datetime
groomed_at: datetime
played_with: datetime
slept_at: datetime    
sold_at: datetime

我希望显示具有最新日期时间的列,但仅适用于fed,groomed,sleep和play列,这些列将随着最近的时间不断变化。有没有办法获得像Animal.last这样的对象,并获得4列中最新日期时间的列?

现在我只有一个if语句来检查4列相互之间,但它似乎很长且没必要。

2 个答案:

答案 0 :(得分:1)

Animal.all.sort_by{|a| [a.fed_at, a.groomed_at, a.slept_at, a.played_with].max}.last

答案 1 :(得分:1)

如果您不需要知道哪一列是最早的,即四列中最近的时间值,您只需使用max从转换为attributes的记录中选择它即可散列:

Animal.last.attributes.values_at("fed_at", "groomed_at", "slept_at", "played_with").max
# => Thu, 07 Apr 2016 00:18:04 CEST +02:00

如果您需要从四列和列名中获取最新值,可以使用max_byattributes哈希中选择最新的键值对:

Animal.last.attributes.
    slice("fed_at", "groomed_at", "slept_at", "played_with").
    max_by{ |k,v| v }
# => e.g. [ "groomed_at", Thu, 07 Apr 2016 00:18:04 CEST +02:00 ]

这将返回一个数组,其中第一项是属性名称,第二项是其值,这是最新时间。