我正在尝试使用子查询来选择某些记录的最新状态。我在SQL中有以下查询,我想在Rails中使用squeel gem重新创建:
SELECT * FROM
changerequests c JOIN
(SELECT changerequest_id, max(created_at) max_created_at from
changerequest_statuses
GROUP BY changerequest_id) as max_status
ON c.id = max_status.changerequest_id
JOIN changerequest_statuses cs
ON cs.changerequest_id = c.id and max_status.max_created_at = cs.created_at
JOIN dim_change_statuses dcs
ON dcs.id = cs.dim_change_status_id按照这里的指导:https://github.com/activerecord-hackery/squeel#joins我有以下子查询:
subquery = ChangerequestStatus.group(:changerequest_id).select { [changerequest_id, max(created_at).as(max_date)] }这是可行的。然而,将它加入到Changerequest模型中,我得到了一个NoMethodError: undefined method 'changerequest_id' for #<Hash>错误
Changerequest.joins{[changerequest_statuses, subquery.as('max_status').on { id == max_status.changerequest_id}]}对我来说,这看起来像是相同的语法。怎么回事?
发布于 2016-05-10 17:31:16
我发现创建这些作用域解决了这个问题:
在ChangerequestStatus.rb中:
scope :max_id, -> {select('MAX(id) as max_id').group(:changerequest_id).map(&:max_id)}在Changerequest.rb中:
scope :max_condition, -> {where('changerequest_statuses.id IN (?)', ChangerequestStatus.max_id)}这只是一个部分的解决方案,因为它只适用于ID而不是日期,并且假设日期较晚的记录总是具有更高的ID,但情况并不总是如此。
https://stackoverflow.com/questions/36555681
复制相似问题