Ruby on rails 使用ActiveRecord查询接口进行分组和排序

Ruby on rails 使用ActiveRecord查询接口进行分组和排序,ruby-on-rails,postgresql,activerecord,Ruby On Rails,Postgresql,Activerecord,我有一个型号,ConnectedUser,它属于另外两个型号User和Station 它是一个简单的模型,只有这些关系和一个布尔活动的 我想要查询的结果将仅是每个用户的每个最新连接用户记录(其中站点是一个特定id) 例如,如果我的ConnectedUser表如下所示 +----+---------+------------+--------+------------+ | id | user_id | station_id | active | created_at | +----+------

我有一个型号,
ConnectedUser
,它属于另外两个型号
User
Station

它是一个简单的模型,只有这些关系和一个布尔
活动的

我想要查询的结果将仅是每个
用户的每个最新
连接用户
记录(其中
站点
是一个特定id)

例如,如果我的
ConnectedUser
表如下所示

+----+---------+------------+--------+------------+
| id | user_id | station_id | active | created_at |
+----+---------+------------+--------+------------+
|  1 |       1 |          1 | true   | 20 June    |
|  2 |       1 |          1 | false  | 19 June    |
|  3 |       1 |          2 | false  | 20 June    |
|  4 |       2 |          1 | false  | 18 June    |
|  5 |       2 |          1 | false  | 21 June    |
+----+---------+------------+--------+------------+
而该站是id为1的,然后我希望查询返回

[
<ConnectedUser id: 1, user_id: 1, station_id: 1, active: true, created_at: "2019-06-20">,
<ConnectedUser id: 5, user_id: 2, station_id: 1, active: false, created_at: "2019-06-21">
]
但不断出现这样的错误:

ActiveRecord::语句无效(PG::GroupingError:错误:列 “已连接的用户。已创建的用户”必须出现在GROUP BY子句中或 (在聚合函数中使用)

我无法获取特定的
ConnectedUser
id,因此感觉我缺少了一些重要的理解,无法理解如何使用
并聚合结果

在一个ActiveRecord查询中是否可能


非常感谢。

在Postgres中,如果您想要每个用户/站点的最新版本,我建议您在
上使用

select distinct on (station_id, user_id) cu.*
from ConnectedUser cu
order by station_id, user_id, created_at desc;

您应该在
上使用
DISTINCT而不是
GROUP
。以下是如何在Rails中实现此功能:

ConnectedUser.select("DISTINCT ON (station_id, user_id) *")
             .where(station_id: params[:station_id])
             .order(created_at: :desc)

当然,
params[:station\u id]
是您想要过滤的内容,这可能会解决这个问题

ConnectedUser.where(active:true).order(user\u id::desc).uniq(&:user\u id)

order
用于对
DESC

在这个解决方案中,我使用的是数组解决方案
uniq
,只选择最新的
user\u id

编辑:

我错了,uniq没有按预期工作,但在这里测试时,我发现:

ConnectedUser.where(active:true).order(在::desc.创建).group(:user\u id)

看起来很像您的,但是,当您使用select时,它只选择字段用户id,因此,您不能在


应该可以工作

抱歉,它不应该改变,我已经编辑了以修复它。谢谢,如果可能的话,我想使用ActiveRecord查询,这样我就可以通过参数传入
站点
。谢谢,尝试
连接用户。选择(“DISTINCT ON(station\u id,user\u id)”。其中(station:station)。顺序(创建地址::desc)
为我提供了这个错误<代码>ActiveRecord::StatementInvalid(PG::SyntaxError:ERROR:SyntaxError位于或接近“FROM”)第1行:选择DISTINCT ON(station\u id,user\u id)FROM“已连接\u使用…
是的,我似乎忘记了select语句中的字符*。请查看我的更新答案,看看它现在是否有效谢谢,使用
uniq
似乎很有趣,但我认为
uniq
现在已经被弃用,取而代之的是
distinct
。在尝试时,它似乎也不会返回最新的记录,但按创建的排序似乎没有帮助。您好,对于编辑的版本,我现在又遇到了一个我一直试图解决的熟悉错误:
(PG::GroupingError:error:column“connected\u users.id”必须出现在GROUP BY子句中或用于聚合函数)
谢谢您的尝试。@Chris,如果您尝试将
id
放入组中,如
GROUP(:id,:user\u id)
?是的,我尝试过这种方法及其变体,但没有任何运气。再次感谢。
ConnectedUser.select("DISTINCT ON (station_id, user_id) *")
             .where(station_id: params[:station_id])
             .order(created_at: :desc)