sql - counter_cache has_many_through sql优化,减少sql查询次数

标签 sql ruby-on-rails optimization activerecord model

我如何优化我的 SQL 查询,以忽略这样的情况:

Meeting.find(5).users.size => SELECT COUNT(*) FROM ... WHERE ...

User.find(123).meetings.size => SELECT COUNT(*) FROm ... WHERE ...


我不知道如何在这里使用 counter_cache。
这是我的模型关系:
class Meeting < ActiveRecord::Base
  has_many :meeting_users
  has_many :users, :through => meeting_users
end

class User < ActiveRecord::Base
  has_many :meeting_users
  has_many :meetings, :through => meeting_users
end

class Meeting_user < ActiveRecord::Base
  belongs_to :meeting
  belongs_to :user
end
最佳解决方案是什么?
以及如何在这里实现 counter_cache ?

最佳答案

从 Rails3.0.5 和更新版本开始,您现在可以将计数器缓存设置为“链接器”模型,在您的情况下,它将是:

class MeetingUser < ActiveRecord::Base
  belongs_to :meeting, :counter_cache => :users_count
  belongs_to :user, :counter_cache => :meetings_count
end

明确指定计数列名很重要,否则使用的列将默认为 meeting_users_count .

关于sql - counter_cache has_many_through sql优化,减少sql查询次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4700247/

相关文章:

sql - OrientDB SQL 查询模拟多对多连接

ruby-on-rails - 如何获取相关模型数据?

algorithm - 针对具有矩阵的极稠密图优化的 dijkstra 算法

sql - 计算包括 0 连接两个具有不同行 postgres 的表

sql - 为什么SQL Server 2008的新T-SQL可以在兼容模式80的数据库上工作?

ruby-on-rails - 动态分配背景图片 scss/sass

c# - 二进制堆与(新)B 堆 : Should it be implemented in the CLR/. NET,以及在哪里?

optimization - SSE 是多余的还是不鼓励的?

mysql - 更新正在查询的同一张表

ruby-on-rails - 在运行时查找 ActiveRecord 类的关联?