我试图在带有范围的rails中使用distinct,我在我的模型中创建了一个方法,如下所示:
def self.fetch_most_recent_by_user(scope)
scope.where(guid: scope.except(:select).select("DISTINCT ON (eld_logs.user_id) user_id, eld_logs.guid").order("user_id, eld_logs.created_at desc").map(&:guid))
end
当我执行此操作时,我得到错误,如:
TestModel.fetch_most_recent_by_user(TestModel.includes(:user))
ERROR: syntax error at or near "DISTINCT"
LINE 1: SELECT guid, DISTINCT ON (user_id) user_id...
在DISTINCT ON
上搜索时,我发现它应该是postgres的select语句中的第一个元素,以使其有效。
我想在select语句中添加DISTINCT ON
。我尝试使用except(:select)
来清除旧的select语句,但是它不起作用,因为includes(:user)
在进行左连接时首先预先设置了用户属性。
我正在使用Rails 4.0.13
和Postgres 9.4.12
。任何帮助表示赞赏。
答案 0 :(得分:0)
我发现如果包含干扰了我的子查询,那么DISTINCT ON
失败了。我修改了我的方法,它可以工作:
def self.fetch_most_recent_eld_log_by_user(scope, include_associations = { })
scope.where(guid: scope.except(:select).select("DISTINCT ON (eld_logs.user_id) eld_logs.user_id, eld_logs.guid").order("eld_logs.user_id, eld_logs.created_at desc").map(&:guid))
.includes(include_associations)
end
如果有人能提供在活动记录范围的select语句中添加内容的方法,那么它仍然会很好。