2012-03-27 27 views
0

我有一张表,用于记录物品价格随时间的变化。 我想写一个方法,抓住整个项目的集合(没有重复),连同他们的最新价格。RoR选择最新的“按列分列”行

这意味着item_id为2的行可能会在我的表内出现好几次,而item_id为3的行可能会在表等内出现多次,但结果应该只包含它们一次他们的最新价格

我想弄清楚一种方式(如果可能的话,不使用Item.find_by_sql()),返回整套物品和他们的最新价格。

目前,我有以下几点:

SELECT * FROM 
(SELECT * FROM item_logs 
ORDER BY created_at DESC) inner_table 
GROUP BY item_id 

它的工作,但它似乎是错误的像这样做,我想我正在寻找一个更优雅的方式来做到这一点,因为目前的实现需要我使用了不太灵活的find_by_sql。

回答

0

不知道它的任何好转,但另一种选择是使用联接:

ItemLog.joins(
    'join (select item_id, max(created_at) as created_at from item_logs group by 1) 
    as i on i.item_id = item_logs.item_id and i.created_at = item_logs.created_at' 
) 

比你的find_by_sql解决方案更长的时间,可能是你的数据库更昂贵的查询,但保留其结果作为有效记录关系所以你可以链接其他方法。