ActiveRecord - запрос с условием последнего элемента в ассоциации - PullRequest
1 голос
/ 23 октября 2019

Попытка сделать своего рода сложный запрос в 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.

Спасибо!

1 Ответ

2 голосов
/ 23 октября 2019

Мне удалось разобраться - вот рабочий запрос:

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

Спасибо.

...