这是一个棘手的关系:
我有以下 AR 关系:
# Doctor
has_many :patients, through: :meetings, uniq: true
has_many :meetings
@doctor.patients 按预期工作,没什么了不起的。但现在我想让患者按任务的 created_at 订购医生(最新的优先)。
# Doctor
has_many :patients, through: :meetings, uniq: true, order: 'meetings.created_at DESC'
has_many :meetings
现在这不起作用(在 Postgres 9 上):“错误:对于 SELECT DISTINCT,ORDER BY 表达式必须出现在选择列表中”。好吧,让我们这样做:
# Doctor
has_many :patients, through: :meetings, select: 'DISTINCT patients.*, meetings.created_at', order: 'meetings.created_at DESC'
has_many :meetings
这再次起作用,但患者不再是唯一的,因为 DISTINCT 正在处理整个 SELECT 子句。
是否有可能在一个 JOINed 查询中删除重复患者但仍按每个患者的最新 session 顺序获取医生的所有患者?
感谢您的提示!
更新:
根据 Oliver 的提示,我更新了如下关系:
# Doctor
has_many :patients,
through: :assignments,
select: 'patients.*, MAX(assignments.created_at) AS last_assignment',
group: 'patients.id',
order: 'last_assignment DESC',
counter_sql: proc { "SELECT COUNT(DISTINCT patients.id) FROM patients INNER JOIN assignments ON patients.id=assignments.patient_id WHERE assignments.doctor_id=#{id}" }
单独的 counter_sql 似乎是必要的,因为 Rails 替换了整个 select 子句来为 #count 构建 SQL。
有什么方法可以减轻它的体积吗?
最佳答案
尝试使用
MAX(meetings.created_at)
无处不在。这样,即使患者有多次会面,您也可以获得独特的患者记录。我的示例将选择最新的 session 。如果您更愿意选择第一个,请使用 MIN(meetings.created_at)
。
关于sql - 区别和秩序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9217761/