Возврат ActiveRecord :: Relation с использованием необработанного SQL-запроса - PullRequest
0 голосов
/ 27 марта 2019

Ниже несколько строк таблицы базы данных indicator_values с записями стран и индикаторов за повторяющиеся годы:

enter image description here

Я хотел бы получитьvalue, который соответствует самому последнему году для каждой страны в массиве:

[{"name"=>"Water", "data"=>[86.35, 88.34]},                #indicator2
 {"name"=>"Electricity", "data"=>[68.62, 94.47]}, ....]    #indicator1

Я могу получить данные за последние годы для каждой страны и показателя с помощью запроса, а затем применить .where() и .pluck() запросы активных записей к объекту, возвращаемому запросом SQL.

[2,3,4].map { |i| 
        sql = "SELECT a.country_id,  a.indicator_id, a.value, a.year
              FROM indicator_values a
              INNER JOIN (
                SELECT country_id, indicator_id, MAX(year) AS year
                FROM indicator_values
                GROUP BY country_id, indicator_id
              ) b ON a.country_id = b.country_id AND a.year = b.year and a.indicator_id = b.indicator_id
              ORDER BY country_id, indicator_id;"

        recent_years_data = ActiveRecord::Base.connection.execute(sql)
        my_array = { "name" => Indicator.find(i).name, "data" => recent_years_data.where('indicator_id = (?) and country_id IN (?)', i, selected_countries).pluck(:value) } }

Результат запроса не является объектом ActiveRecord::Relation и поэтому не может работать с .where() и .pluck().Я ищу способ получить ActiveRecord::Relation или другой обходной путь для создания желаемого массива.Аналогичные посты советуют с использованием Active Record Query, но я не смог понять, как связать такой длинный запрос, как Active Record Query, вместо необработанного SQL.

1 Ответ

0 голосов
/ 28 марта 2019

У меня есть другой подход, который работает и который не предполагает использование соединений.

IndicatorValue.
    select('DISTINCT ON (cvs.country_id, cvs.indicator_id), cvs.*').
    order('cvs.country_id, cvs.indicator_id, cvs.year DESC') 

cvs обозначает indicator_values В результате получается ActiveRecord::Relation

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...