Ruby on rails 包括不允许对子表进行外部联接和计数

Ruby on rails 包括不允许对子表进行外部联接和计数,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,必须按如下方式指定外部联接是否正确 Course.includes(:registrations).group("courses.id").select("courses.*, COUNT(registrations.id) as registrations_count") 最后一个查询确实有效,但它认为我所做的应该是相当标准的,所以我想确定我总体上采取了正确的方法 在我的课程索引视图中,我显示每个记录的注册计数。这方面的最佳实践是什么 计数器\u缓存是计算关联对象的最佳选项。Rails中的计

必须按如下方式指定外部联接是否正确

Course.includes(:registrations).group("courses.id").select("courses.*, COUNT(registrations.id) as registrations_count")
最后一个查询确实有效,但它认为我所做的应该是相当标准的,所以我想确定我总体上采取了正确的方法

在我的课程索引视图中,我显示每个记录的注册计数。这方面的最佳实践是什么

计数器\u缓存
是计算
关联
对象的最佳选项。Rails中的计数器缓存只是跟踪关联模型数量的附加列

你必须这么做

Course.joins('LEFT OUTER JOIN registrations ON registrations.course_id = courses.id').select('courses.*, COUNT(registrations.id) as registrations_count').group('courses.id')
然后你就可以这么做了

belongs_to :course , counter_cache: true
在中了解更多信息

看起来您缺少了
包含
联接
之间的区别

对我来说这很好

@course.registrations_count

我知道includes v joins的区别只是奇怪的是,左外连接需要在这里显式写入。但如果使用计数器缓存,则不会:)谢谢。看起来可以通过@course.registrations\u count列访问,而不是registrations.size?
@course.registrations_count
Course.joins('LEFT OUTER JOIN registrations ON registrations.course_id = courses.id').select('courses.*, COUNT(registrations.id) as registrations_count').group('courses.id')