Rails ActiveRecord включает в запрос несвязанные таблицы - PullRequest
0 голосов
/ 29 июня 2018

У меня есть модель Benchmark. У него есть метод scores, который выполняет некоторые вычисления. Во время этих расчетов используются все значения из таблицы Synonyms. У него есть соответствующая модель, но эти модели (Benchmark и Synonym) не связаны друг с другом. Мне всегда нужны все синонимы в любом из моих расчетов. Синонимы используются для замены значений в паре строк, которые являются атрибутами Benchmark. Чтобы получить синонимы, я просто использую метод Synonym.all внутри моего scores метода:

  def scores
    @synonyms ||= Hash[Synonym.all.map {|synonym| [synonym.synonym, synonym.word]}]
    @scores ||= # replacing substrings in Benchmark name using synonyms
  end

Пока все хорошо. Но теперь я хочу выполнить массовые вычисления для всех тестов, которые у меня есть. Это, очевидно, приводит к проблеме запроса N + 1 - каждый метод scores вызывает метод Synonym.all. Rails достаточно умен, чтобы кэшировать этот запрос и избежать множества запросов к БД, но мне все еще интересно, есть ли способ сказать ActiveRecord, что все мои тесты всегда включают все синонимы? Я не могу использовать принадлежащее / has_many / etc, потому что мои таблицы не связаны.

Одним из решений, которое я использовал в аналогичном случае, было извлечение Synonym.all, затем извлечение Benchmark.includes(:...).all, а затем внедрение синонимов вручную в каждый тест, как benchmarks.each {|b| b.synonyms = @synonyms}, но я ищу более элегантный подход .

Я использую Rails 5.

...