【问题标题】:get latest of each out of one rails model从一个轨道模型中获取最新的每个模型
【发布时间】:2010-02-18 16:49:25
【问题描述】:

我有一个模型,我保存了发生在某个人身上的更改。我想得到现在所有人的最新状态。

所以我需要: - 顺序:created_at asc。 - find_all: 限制:每个人改变一个

我怎样才能做到这一点?

谢谢, 马库斯

【问题讨论】:

  • 如果你想要最新(最新)的记录,那么你想要 created_at DESC,而不是 ASC。

标签: sql ruby-on-rails


【解决方案1】:

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

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

【讨论】:

  • ORDER 在 GROUP 之后应用。所以返回的结果不会包含最后一个状态。
  • 你是对的,KandadaBoggu。不过,我很确定,使用 GROUP BY 和 MAX 的解决方案不需要子查询。
  • 要获取 OrderState 表中匹配行的所有字段,您必须使用查询。这是一个经典的问题。例如:列出每个部门薪水最高的员工详细信息等。
【解决方案2】:

试试这个:

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 表中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2017-07-06
    相关资源
    最近更新 更多