Преобразование длинного SQL-запроса в выражение ActiveRecord

#ruby-on-rails

#ruby-on-rails

Вопрос:

Мне нужно преобразовать приведенный ниже SQL-запрос в выражение запроса active record. Я наткнулся на ряд связанных сообщений, которые предполагают объединение двух разных моделей с помощью .joins() но в этом случае я объединяю модель с подмножеством самой себя. В частности, я не смог найти, как выразить SELECT a.some_column, ... FROM my_model a

 SELECT a.city_id, a.statistic_id, a.value, a.year
FROM city_values a
INNER JOIN (
  SELECT city_id, statistic_id, MAX(year) AS year
  FROM city_values
  GROUP BY city_id, statistic_id) b 
  ON a.city_id = b.city_id AND a.year = b.year and a.statistic_id = 
  b.statistic_id
  ORDER BY city_id, statistic_id;
  

У меня есть модель с именем CityValue, соответствующая данным для различных городов, статистики и лет. Модель имеет атрибуты city_id, statistic_id, значение, год. Запрос ActiveRecord предназначен для получения статистических значений за последние годы для каждого города и статистики и возврата ActiveRecord::Relation объекта.

Ответ №1:

Насколько я понимаю предоставленный SQL-запрос, вы пытаетесь выбрать строки, содержащие статистику за последний год для каждой уникальной пары (city_id, statistic_id).

Я бы не стал использовать join для решения этой проблемы. cvs означает city_values .

 CityValue.
    select('DISTINCT ON (cvs.city_id, cvs.statistic_id), cvs.*').
    order('cvs.city_id, cvs.statistic_id, cvs.year DESC') 
  

Пояснения о DISTINCT ON можно найти здесь:
https://www.vertabelo.com/blog/technical-articles/postgresql-select-distinct-on .