Попытка сделать своего рода сложный запрос в ActiveRecord прямо сейчас. Не уверен, что это возможно сделать полностью в ActiveRecord (т.е. без простой фильтрации промежуточных результатов в Rails). Я хотел бы сделать как можно больше манипуляций с базой данных.
У меня есть модели PullRequest
и Release
с отношением многие-многие. Существуют поля в Release
модель is_rollback
(логическое значение) и ended_at
(дата / время). Я пытаюсь найти все pull_requests
, для которых их releases
ассоциация 1) непуста и 2) заканчивается 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 DB.
Спасибо!