如何检索每列组合的最新Active Record对象?

时间:2017-04-08 14:15:48

标签: ruby-on-rails activerecord

我有一个名为Event的模型,它属于AreaTask。我正在尝试检索仅包含每个区域和任务组合的最新事件的事件集合。也就是说,我只想要具有相同area_id和task_id的事件的最新事件。事件集合示例:

|event_id|area_id|task_id| ... |
|--------|-------|-------|-----|
|      5 |     3 |     2 | ... |
|      4 |     3 |     1 | ... |
|      3 |     3 |     2 | ... |

这里我只想要返回事件5和4,因为3岁了。

我尝试使用似乎有用的Event.select(:area_id,:task_id).distinct,但删除了返回事件的所有其他属性,包括:id。感谢任何帮助或建议!

2 个答案:

答案 0 :(得分:2)

您可以在select中使用原始SQL,因此您可以尝试以下内容:

Event.select("DISTINCT(CONCAT(area_id, task_id)), id, attr1, attr2")

idattr1attr2Event表中的其他属性。

或者您可以使用.group而不是.distinct而忘记使用原始SQL:

Event.all.group(:area_id,:task_id)

您将获得与使用DISTINCT相同的结果,并且所有属性都可用。

<强>更新

要在分组之前订购,您可以将find_by_sql与嵌套查询一起使用(同样,原始SQL):

Event.find_by_sql(
  "SELECT * FROM (
    SELECT * FROM `events`
    ORDER BY `events`.`created_at`) AS t1
  GROUP BY t1.`area_id`, t1.`task_id`";
)

答案 1 :(得分:0)

换句话说,您需要按area_idtask_id对事件进行分组,并选择每个组中的最近记录。关于为这种情况构建sql-query有question。你桌子的PostgreSQL版本将是这样的:

SELECT DISTINCT ON (area_id, task_id) events.*
FROM events
ORDER BY area_id ASC, task_id ASC, created_at DESC

此查询的Rails代码:

Event.
  select("DISTINCT ON (area_id, task_id) events.*").
  order("area_id ASC, task_id ASC, created_at DESC")