Нужна помощь в написании SQL-запроса в рельсах, чтобы я получил ActiveRelation - PullRequest
0 голосов
/ 21 июня 2019

Мне нужно активное отношение записи, которое дает мне последнюю запись региона, города, комбинации кроватей.У меня SQL-запрос написан, как показано ниже, но мне нужно выяснить, есть ли возможность использовать другой подход, чтобы он возвращал отношение активной записи, а не массив.Любые предложения?

Текущий запрос:

    @current_ltm_market_stats = LtmStatsByBedCount.find_by_sql(" SELECT *
          FROM ltm_stats_by_bed_counts lstats
          WHERE lstats.city_id = '#{@city_id}'
              #{@region_id_condition}
              AND (lstats.beds,lstats.city_id,lstats.region_id,lstats.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 BY lstats.year DESC,lstats.month DESC")

Я пробовал это раньше, что привело к связи, но она работает очень медленно, и результат не совсем совпадает.Есть ли лучшие способы сделать это?

@all_ltm_market_stats = LtmStatsByBedCount.where(city_id: @market.city_id, region_id: @market.region_id)
        @current_ltm_market_stats = @latest_year_ltm_market_stats.where(month: @latest_year_ltm_market_stats.all_ltm_market_stats.select('Max(year)'))

1 Ответ

0 голосов
/ 23 июня 2019

Информация в вопросе неполная, поэтому мне, возможно, придется обновить мой ответ при добавлении дополнительных деталей ,
Но вот первоначальный черновик с доступной информацией:

@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 может быть улучшен и за счет дополнительной информации.

Кроме того, вы захотите иметь тщательно составленные индексы для этой таблицы, если вы собираетесь часто использовать этот запрос для больших наборов данных.

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