问题描述
我有一个变量(@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)
与计数器缓存相比的优势:
- 插入关联记录时无其他更新查询。
- 如果计数很关键并且您有很多写活动,则更准确。
缺点:
- 为每个查询计算计数,但读取时效率较低。
- 这很渴望加载记录。
- 与简单的模型回调相比,代码复杂性更高。