我有一个名为Event
的模型,它属于Area
和Task
。我正在尝试检索仅包含每个区域和任务组合的最新事件的事件集合。也就是说,我只想要具有相同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
。感谢任何帮助或建议!
答案 0 :(得分:2)
您可以在select
中使用原始SQL,因此您可以尝试以下内容:
Event.select("DISTINCT(CONCAT(area_id, task_id)), id, attr1, attr2")
id
,attr1
和attr2
是Event
表中的其他属性。
或者您可以使用.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_id
和task_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")