У меня есть модель 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.