class Course < ActiveRecord::Base
has_many :registrations
delegate :count, to: :registrations, prefix: true
end
class Registration < ActiveRecord::Base
belongs_to :course
end
在我的课程索引视图中,我显示了每条记录的注册计数。这是什么最佳做法?使用包含(:registrations)和委托的registrations_count方法看起来比在主查询中执行数据库计数要慢(在控制台中)。
我想显示所有记录,因此我无法使用INNER join()。使用includes()如下所示给出错误PG::GroupingError: ERROR: column "registrations.id" must appear in the GROUP BY clause or be used in an aggregate function
我尝试添加一个where子句:注册到此但它仍然存在错误:
Course.includes(:registrations).group("courses.id").select("courses.*, COUNT(registrations.id) as 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')
这最后一个查询确实有效,但感觉我所做的应该是相当标准的,所以我想确保我采取正确的方法。
答案 0 :(得分:4)
在我的课程索引视图中,我显示了每条记录的注册计数。这是什么最佳做法?
counter_caching
是计算association
个对象的最佳选择。 Rails中的计数器缓存只是跟踪关联模型数量的附加列。
你必须这样做
belongs_to :course , counter_cache: true
然后你就可以这么做了
@course.registrations_count
中了解详情
您似乎错过了includes
与joins
,Learn here
对我来说这很好。
Course.joins('LEFT OUTER JOIN registrations ON registrations.course_id = courses.id').select('courses.*, COUNT(registrations.id) as registrations_count').group('courses.id')