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

Я хотел бы получить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.