Rails ActiveRecord在查询中包含不相关的表

时间:2018-06-29 10:32:47

标签: ruby-on-rails rails-activerecord

我有模型Benchmark。它具有方法scores,它正在执行一些计算。 在此计算期间,它将使用表Synonyms中的所有值。它具有相应的模型,但是这些模型(BenchmarkSynonym)彼此无关。在任何基准测试中,我总是需要 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。

0 个答案:

没有答案