现在尝试在ActiveRecord中进行某种复杂的查询。不知道是否有可能完全在ActiveRecord中完成(即,不只是在Rails中过滤中间结果)。我想在数据库中进行尽可能多的操作。
我有一个PullRequest
和Release
模型,具有很多关系。 Release
模型is_rollback
(布尔值)和ended_at
(日期时间)上存在字段。我试图找到所有pull_requests
的{{1}}关联为1且为非空且2)以releases
结尾且release
为is_rollback = true
时结束的releases
由ended_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数据库。
谢谢!
答案 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')
谢谢。