我有一个模型,我保存了某些人发生的变化。我想现在得到所有人的最新状态。
所以我需要: - order:created_at asc。 - find_all:limit:每个人改变一次
我该如何实现?
谢谢, 马库斯
答案 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表中。