Информация в вопросе неполная, поэтому мне, возможно, придется обновить мой ответ при добавлении дополнительных деталей ,
Но вот первоначальный черновик с доступной информацией:
@current_ltm_market_stats = LtmStatsByBedCount.
where(city_id: @city_id).
where(@region_id_condition).
where("(beds, city_id, region_id, reporting_date) IN (
SELECT lstats.beds,
lstats.city_id,
lstats.region_id,
max(lstats.reporting_date)
FROM ltm_stats_by_bed_counts lstats
WHERE lstats.city_id = '#{@city_id}'
#{@region_id_condition}
GROUP BY city_id, region_id, beds)").
order(year: :desc, month: :desc)
Обратите внимание, что вам, возможно, придется настроить @region_id_condition
, чтобы это работало.
Теоретически это эквивалентно вашей версии SQL (это означает, что он сгенерирует тот же sql, исключая псевдоним таблицы) и вернет объект отношения AR .Что является единственным требованием в вопросе.Очевидно, что SQL может быть улучшен и за счет дополнительной информации.
Кроме того, вы захотите иметь тщательно составленные индексы для этой таблицы, если вы собираетесь часто использовать этот запрос для больших наборов данных.