Ruby On Rails-查找具有大多数有很多关联的对象的最佳方法是什么?

问题描述

我有一个变量(@cars),其中包含来自数据库的数据,从这里开始,我需要生成一个XLS文档。

由于XLS文档的某些细节,我需要提前知道一些关联的长度(模型Car与模型has_many具有PrevIoUsOwner关联)-特别是,我需要知道每辆车有多少以前的车主,并且需要捕获所有车中最多的以前的车主。

一种发现的方法是将counter_cache添加Car模型结构中,还有其他方法可以解决这种情况吗?我有@cars变量,从那里我需要找到拥有最多车主的汽车。

解决方法

处理方式之一是加入并选择计数:

Car.left_joins(:previous_owners)
   .select(
     'cars.*','COUNT(previous_owners.*) AS previous_owners_count'
   )
   .group(:id)
   .order(previous_owners_count: :desc)

与计数器缓存相比的优势:

  • 插入关联记录时无其他更新查询。
  • 如果计数很关键并且您有很多写活动,则更准确。

缺点:

  • 为每个查询计算计数,但读取时效率较低。
  • 这很渴望加载记录。
  • 与简单的模型回调相比,代码复杂性更高。