ruby-on-rails - 包括不允许外连接和子表计数

标签 ruby-on-rails activerecord

class Course < ActiveRecord::Base
  has_many :registrations

  delegate :count, to: :registrations, prefix: true
end

class Registration < ActiveRecord::Base
  belongs_to :course
end

在我的类(class)索引 View 中,我显示了每条记录的注册数。对此的最佳做法是什么?将 includes(:registrations) 与委托(delegate)的 registrations_count 方法一起使用(在控制台中)看起来比在主查询中执行数据库计数要慢。

我想显示所有记录,所以我不能使用 INNER join()。使用 include() 如下给出错误 PG::GroupingError: ERROR: column "registrations.id" must appear in the GROUP BY clause or be used in an aggregate function我尝试在 :registrations 上添加 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')

最后一个查询确实有效,但感觉我所做的应该是相当标准的,所以我想确保我总体上采取了正确的方法。

最佳答案

In my Courses index view I show a count of Registrations for each record. What is best practice for this?


counter_caching是计数的最佳选择association对象。 Rails 中的计数器缓存只是一个额外的列,用于跟踪关联模型的数量。

你只需要这样做
belongs_to :course , counter_cache: true

然后你可以简单地做到这一点
@course.registrations_count

RailsCast 中了解更多信息

看起来你错过了 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')

关于ruby-on-rails - 包括不允许外连接和子表计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23232546/

相关文章:

ruby-on-rails - gem安装权限问题

ruby-on-rails - 使用 "directory?"方法检测目录

ruby-on-rails - Rails 合并 2 个查询结果

arrays - 如何在 Ruby 中为正则表达式字符串匹配生成百分比?

ruby-on-rails - 具有不同列 Rails 的相同模型

ruby - 每当 Activerecord 的 :after_save callbacks trigger 触发回调

mysql - rails : creating column references without foreign keys

ruby-on-rails - 如何通过 Hotwire Turbo 流正确渲染图像?

ruby-on-rails - 如何通过 has_many 计算 Rails 应用程序 View 中的平均值?

ruby-on-rails - 如何仅查找所有孙子都符合 Rails 中某些条件的祖 parent 记录?