【问题标题】:How do I sort a table by the maximum value of associated records?如何按关联记录的最大值对表进行排序?
【发布时间】:2013-05-11 02:46:28
【问题描述】:

我有一个有很多会议的客户模型。

class Client < ActiveRecord::Base

  has_many :meetings

end

class Meeting < ActiveRecord::Base

  belongs_to :client

end

我想生成一个 ActiveRecord 查询,该查询将返回按最近会议的顺序排序的客户端(由 meeting_time 列确定),但不知道如何执行此操作。我显然需要以某种方式加入表,但我不知道如何在 AR 中生成合适的子查询。如何为每个客户编写仅包含 1 个会议的加入,特别是最近的会议(即给定 meeting.client_id 的 meeting.meeting_time 的最高值)。我的数据库是 PostgreSQL。

我以前也遇到过类似的问题,也遇到过类似的问题,但显然没有从这个过程中学到很多东西。指向一个很好的资源来了解这些情况的指针也将不胜感激。

【问题讨论】:

  • 最近是什么意思?上个星期?上个月?
  • 没关系。我正在寻找最新的。

标签: ruby-on-rails ruby-on-rails-3 activerecord rails-activerecord


【解决方案1】:

这样的?

Client.joins(:meetings).group('clients.id').order('max(meetings.meeting_time) DESC')

这将:

  1. 抢客户
  2. 参加会议
  3. 按客户 (id) 分组
  4. 现在我们可以使用max(meetings.meeting_time),这是每个客户最近的会议
  5. 然后按最近的会议时间降序对客户进行排序

【讨论】:

  • 这给出了错误 PG::Error: ERROR: column "meetings.id" 必须出现在 GROUP BY 子句中或用于 PostgreSQL 的聚合函数中,但将 group 子句更改为 .group ('clients.id, meeting.id') 正是我想要的。谢谢!
  • 实际上,如果有超过 1 个会议,仔细检查会返回多个 Client 实例。嗬!有什么进一步的进展吗?
  • 是的,如果您按客户 ID 和会议 ID 分组,您最终会得到每个客户和会议一排,这不是我们想要的。我已经测试了查询,它对我来说工作正常,正在为您执行的 sql 查询是什么?你的模型有范围吗?
  • 抱歉耽搁了。我得到的错误是根据我上面的评论。我的模型中没有范围。你用哪个数据库测试过?我听说 Postgres 比其他人更严格。
  • 嗯,实际上重新尝试它似乎工作得很好。我想知道发生了什么变化?无论如何,很抱歉给您带来困难。
猜你喜欢
  • 1970-01-01
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多