在活动记录范围中的select语句中预先添加DISTINCT ON

时间:2017-07-09 08:51:31

标签: ruby-on-rails postgresql activerecord distinct-on

我试图在带有范围的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.13Postgres 9.4.12。任何帮助表示赞赏。

1 个答案:

答案 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语句中添加内容的方法,那么它仍然会很好。