首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Squeel子查询

Squeel子查询
EN

Stack Overflow用户
提问于 2016-04-12 01:48:22
回答 1查看 196关注 0票数 1

我正在尝试使用子查询来选择某些记录的最新状态。我在SQL中有以下查询,我想在Rails中使用squeel gem重新创建:

代码语言:javascript
复制
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我有以下子查询:

代码语言:javascript
复制
subquery = ChangerequestStatus.group(:changerequest_id).select { [changerequest_id, max(created_at).as(max_date)] }

这是可行的。然而,将它加入到Changerequest模型中,我得到了一个NoMethodError: undefined method 'changerequest_id' for #<Hash>错误

代码语言:javascript
复制
Changerequest.joins{[changerequest_statuses, subquery.as('max_status').on { id == max_status.changerequest_id}]}

对我来说,这看起来像是相同的语法。怎么回事?

EN

回答 1

Stack Overflow用户

发布于 2016-05-10 17:31:16

我发现创建这些作用域解决了这个问题:

在ChangerequestStatus.rb中:

代码语言:javascript
复制
scope :max_id, -> {select('MAX(id) as max_id').group(:changerequest_id).map(&:max_id)}

在Changerequest.rb中:

代码语言:javascript
复制
scope :max_condition, -> {where('changerequest_statuses.id IN (?)', ChangerequestStatus.max_id)}

这只是一个部分的解决方案,因为它只适用于ID而不是日期,并且假设日期较晚的记录总是具有更高的ID,但情况并不总是如此。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36555681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档