023 计数器缓存字段(counter cache column)

简介:

Counter Cache Column

If you need to display the record count for a has_many association, you can improve performance by caching that number in a column.
 
如果你需要显示某个对象所关联对象的个数,你可以在一个字段中缓存这个数字。
 
例:
List Projects
 
project1(10tasks)
project2(15tasks)
project3(20tasks)
 
看一下代码:
# projects_controller.rb
def index
    @projects=Project.find(:all)
end
 
#index.rhtml
 
<% @projects.each do |project|%>
     <%= project.name%><small>(<%= pluralize project.tasks.size , 'task'%>)</small>
<%end%>
 
 
但是在日志中,我们看到,对project的每一个对象,都要进行一次SQL查询得到task的个数。
利用上节提到过的贪婪加载,可以在index这个action里
def index
     @projects=Project.find(:all, :include=>:tasks)
end
 
这样就可以通过一条SQL查询语句得到想要显示的结果了。但是这样的查询语句会将很多不需要的信息也进行查询。
现在我们只需要关联的tasks的数量
 
所以我们想到在project表中加入一个统计每一个对象拥有的tasks数量的这样一个字段。方法:
script/generate migration add_tasks_count
def self.up
add_column :projects, :tasks_count, :integer,:default=>0
Project.reset_column_information
Project.find(:all).each do |p|
    p.update_attribute :tasks_count, p.tasks.length
end
end
def self.down
remove_column :projects, :tasks_count
end
 
>rake db:migrate
 
这样就加载上缓存字段了。
还有重要的一步,要在task.rb中加上
class Task <ActiveRecord::Base
   belongs_to :project, :counter_cache=>true
 end
 
 
---------
reset_column_information()
Resets all the cached information about columns, which will cause them to be reloaded on the next request.




本文转自 fsjoy1983 51CTO博客,原文链接:http://blog.51cto.com/fsjoy/131823,如需转载请自行联系原作者
目录
相关文章
|
3月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
|
3月前
|
缓存 弹性计算 NoSQL
【Azure Redis 缓存 Azure Cache For Redis】Redis连接池
【Azure Redis 缓存 Azure Cache For Redis】Redis连接池
|
3月前
|
缓存 Java
Java本地高性能缓存实践问题之使用Caffeine的Cache接口来查找一个缓存元素的问题如何解决
Java本地高性能缓存实践问题之使用Caffeine的Cache接口来查找一个缓存元素的问题如何解决
|
3月前
|
缓存 NoSQL Java
【Azure Redis 缓存 Azure Cache For Redis】Redis出现 java.net.SocketTimeoutException: Read timed out 异常
【Azure Redis 缓存 Azure Cache For Redis】Redis出现 java.net.SocketTimeoutException: Read timed out 异常
|
3月前
|
存储 缓存 NoSQL
【Azure Redis 缓存 Azure Cache For Redis】如何设置让Azure Redis中的RDB文件暂留更久(如7天)
【Azure Redis 缓存 Azure Cache For Redis】如何设置让Azure Redis中的RDB文件暂留更久(如7天)
|
3月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】Azure Cache for Redis 服务的导出RDB文件无法在自建的Redis服务中导入
【Azure Redis 缓存】Azure Cache for Redis 服务的导出RDB文件无法在自建的Redis服务中导入
|
3月前
|
缓存 开发框架 NoSQL
【Azure Redis 缓存】VM 里的 Redis 能直接迁移到 Azure Cache for Redis ? 需要改动代码吗?
【Azure Redis 缓存】VM 里的 Redis 能直接迁移到 Azure Cache for Redis ? 需要改动代码吗?
|
3月前
|
缓存 NoSQL Unix
【Azure Redis 缓存】Azure Cache for Redis 中如何快速查看慢指令情况(Slowlogs)
【Azure Redis 缓存】Azure Cache for Redis 中如何快速查看慢指令情况(Slowlogs)
|
3月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】Azure Cache for Redis 是否记录具体读/写(Get/Set)或删除(Del)了哪些key呢?
【Azure Redis 缓存】Azure Cache for Redis 是否记录具体读/写(Get/Set)或删除(Del)了哪些key呢?
|
3月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】Azure Cache for Redis 专用终结点, 虚拟网络, 公网访问链路
【Azure Redis 缓存】Azure Cache for Redis 专用终结点, 虚拟网络, 公网访问链路