ActiveRecord - 查询关联中最后一个元素的条件
Posted
技术标签:
【中文标题】ActiveRecord - 查询关联中最后一个元素的条件【英文标题】:ActiveRecord - Query with Condition of Last Element in Association 【发布时间】:2019-10-23 16:42:47 【问题描述】:现在正在尝试在 ActiveRecord 中执行某种复杂的查询。不确定是否可以完全在 ActiveRecord 中完成(即不只是在 Rails 中过滤中间结果)。我想在数据库中进行尽可能多的操作。
我有一个具有多对多关系的 PullRequest
和 Release
模型。 Release
模型 is_rollback
(boolean) 和 ended_at
(datetime) 上存在字段。我试图找到所有pull_requests
,它们的releases
关联1)是非空的,2)当releases
按ended_at
排序时,以release
结尾,is_rollback = true
。
这是我目前所拥有的:
PullRequest
.joins(:releases) # filter pull requests with empty release associations
.having('releases.is_rollback = true AND releases.ended_at = MAX(releases.ended_at)') # where latest release is a rollback
.group('pull_requests.id, releases.ended_at, releases.is_rollback') # necessary with 'having'
having
子句虽然没有按预期工作,但查询仍在返回最新版本不是回滚的拉取请求。对复杂的 SQL 查询没有丰富的经验,因此不胜感激。我正在使用 Rails 4,PostgreSQL 数据库。
谢谢!
【问题讨论】:
nonempty
的定义是什么?您可以添加您的模型(和迁移)以及您正在使用的 RDBMS。
【参考方案1】:
我能够弄清楚 - 这是有效的查询:
pull_requests
.joins(:releases).distinct
.group('releases.ended_at, pull_requests.id, releases.id')
.having('releases.ended_at IN (SELECT MAX(releases.ended_at))')
.where('releases.is_rollback = true')
谢谢。
【讨论】:
以上是关于ActiveRecord - 查询关联中最后一个元素的条件的主要内容,如果未能解决你的问题,请参考以下文章
Ruby on Rails - ActiveRecord 关联问题:查询未正确进行(单数与复数?)
带有 has_many belongs_to 关联的 Rails activerecord 查询
使用 Rails ActiveRecord 查询接口查找 a 的平均数量在两个模型之间有很多关联