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

时间:2019-10-23 16:42:47

标签: sql ruby-on-rails ruby activerecord rails-activerecord

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

我有一个PullRequestRelease模型,具有很多关系。 Release模型is_rollback(布尔值)和ended_at(日期时间)上存在字段。我试图找到所有pull_requests的{​​{1}}关联为1且为非空且2)以releases结尾且releaseis_rollback = true时结束的releasesended_at订购。

这是我到目前为止所拥有的:

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数据库。

谢谢!

1 个答案:

答案 0 :(得分:2)

我能够弄清楚-这是有效的查询:

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')

谢谢。