【发布时间】:2010-02-18 16:49:25
【问题描述】:
我有一个模型,我保存了发生在某个人身上的更改。我想得到现在所有人的最新状态。
所以我需要: - 顺序:created_at asc。 - find_all: 限制:每个人改变一个
我怎样才能做到这一点?
谢谢, 马库斯
【问题讨论】:
-
如果你想要最新(最新)的记录,那么你想要 created_at DESC,而不是 ASC。
标签: sql ruby-on-rails
我有一个模型,我保存了发生在某个人身上的更改。我想得到现在所有人的最新状态。
所以我需要: - 顺序:created_at asc。 - find_all: 限制:每个人改变一个
我怎样才能做到这一点?
谢谢, 马库斯
【问题讨论】:
标签: sql ruby-on-rails
您需要使用:group,它转换为SQL 中的GROUP BY 语句。
YourModel.all(:order => 'created_at DESC', :group => :person_id)
【讨论】:
试试这个:
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 表中。
【讨论】: