获得最新的一个轨道模型

时间:2010-02-18 16:49:26

标签: sql ruby-on-rails

我有一个模型,我保存了某些人发生的变化。我想现在得到所有人的最新状态。

所以我需要: - order:created_at asc。 - find_all:limit:每个人改变一次

我该如何实现?

谢谢, 马库斯

2 个答案:

答案 0 :(得分:2)

您需要使用:group,这将转换为SQL中的GROUP BY语句。

YourModel.all(:order => 'created_at DESC', :group => :person_id)

答案 1 :(得分:1)

试试这个:

person_hash = OrderState.maximum(:created_at, :group => :person_id)
person_hash.each |person_id, created_at|
  state = OrderState.find_by_person_id_and_created_at(person_id, created_at)
end

有关详细信息,请参阅ActiveRecord documentation

如果您想在数据库中进行大部分计算,请尝试以下方法:

OrderState.find_by_sql("SELECT A.* FROM order_states A,
                (SELECT person_id, MAX(BA.created_at) AS created_at 
                 FROM order_states BA 
                 GROUP BY BA.person_id
                 ) AS B
WHERE  A.person_id = B.person_id AND 
       A.created_at = B.created_at")

在这两种方法中,您应该索引created_at列。如果您有数百万用户,这不是一个好策略。您应该将最后一个状态存储在Person表中。