我有模型Benchmark
。它具有方法scores
,它正在执行一些计算。
在此计算期间,它将使用表Synonyms
中的所有值。它具有相应的模型,但是这些模型(Benchmark
和Synonym
)彼此无关。在任何基准测试中,我总是需要 all 同义词。同义词用于替换作为基准属性的几个字符串中的值。
要获取同义词,我只需在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我的所有基准测试始终包含所有同义词?因为我的表未链接,所以我不能使用belongs_to / has_many / etc。
我在类似情况下使用的解决方案之一是获取Synonym.all
,然后获取Benchmark.includes(:...).all
,然后将同义词手动插入每个基准中,例如benchmarks.each {|b| b.synonyms = @synonyms}
,但我我正在寻找更优雅的方法。
我使用Rails 5。