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)