ActiveRecord - 查询关联中最后一个元素的条件

Posted

技术标签:

【中文标题】ActiveRecord - 查询关联中最后一个元素的条件【英文标题】:ActiveRecord - Query with Condition of Last Element in Association 【发布时间】:2019-10-23 16:42:47 【问题描述】:

现在正在尝试在 ActiveRecord 中执行某种复杂的查询。不确定是否可以完全在 ActiveRecord 中完成(即不只是在 Rails 中过滤中间结果)。我想在数据库中进行尽可能多的操作。

我有一个具有多对多关系的 PullRequestRelease 模型。 Release 模型 is_rollback(boolean) 和 ended_at (datetime) 上存在字段。我试图找到所有pull_requests,它们的releases关联1)是非空的,2)当releasesended_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 - 查询关联中最后一个元素的条件的主要内容,如果未能解决你的问题,请参考以下文章

Rails Activerecord 通过三个关联查询?

Ruby on Rails - ActiveRecord 关联问题:查询未正确进行(单数与复数?)

带有 has_many belongs_to 关联的 Rails activerecord 查询

使用 Rails ActiveRecord 查询接口查找 a 的平均数量在两个模型之间有很多关联

Rails在使用多态关联时组合和排序ActiveRecord关系

获取 CodeIgniter ActiveRecord 结果中每一行的关联数组