Rails宝典之第二十三式: counter cache

Inkplate 6 MOTION电子墨水屏技术解析与应用实践 电子墨水屏技术通过带电粒子在电场中的移动实现显示,具有低功耗、类纸张视觉体验等特性。其核心原理是通过TFT背板控制微胶囊内黑白粒子的分布位置,这种双稳态特性使得屏幕仅在刷新时耗电。在物联网和智能硬件领域,电子墨水屏广泛应用于电子价签、智能家居控制面板等场景。以Inkplate 6 MOTION为代表的创新产品,通过STM32H743+ESP32-C3双核架构实现11fps局部刷新,结合LDO电源管理和DMA加速技术,显著提升了动态内容显示效果。开发者可利用Arduino、MicroPython等多语言支持, 阅读详情


这次就是讲用_count字段来缓存has_many的计数 


看Project和Task的例子: 
Java代码   收藏代码
  1. <h1>Projects</h1>  
  2.   
  3. <table>  
  4. <% for project in @projects %>  
  5.   <tr>  
  6.     <td><%= link_to project.name, poject_path(project) %></td>  
  7.     <td><small>(<%= pluralize project.tasks.size, 'task' %>)</small></td>  
  8.   </tr>  
  9. <% end %>  
  10. </table>  

上面的页面代码对所有的@projects显示tasks.size,看下log: 
Java代码   收藏代码
  1. SQL (0.006385)  SELECT count(*) AS count_all FROM tasks WHERE (tasks.project_id = 326)  
  2. SQL (0.000220)  SELECT count(*) AS count_all FROM tasks WHERE (tasks.project_id = 327)  
  3. SQL (0.000383)  SELECT count(*) AS count_all FROM tasks WHERE (tasks.project_id = 328)  
  4. SQL (0.000197)  SELECT count(*) AS count_all FROM tasks WHERE (tasks.project_id = 329)  
  5. SQL (0.000215)  SELECT count(*) AS count_all FROM tasks WHERE (tasks.project_id = 330)  

上面显示了对每个project都使用SQL来count tasks,我们采用eager loading看看能否改进性能: 
Java代码   收藏代码
  1. class ProjectsController < ApplicationController  
  2.   def index  
  3.     @projects = Project.find(:all, :include => :tasks)  
  4.   end  
  5. end  

再来看看log: 
Java代码   收藏代码
  1. Project Lood Incluing Associations (0.000954)  SELECT projects.'id' AS t0_r0, projects.'name' AS t0_r1, tasks.'id'  
  2. AS t1_r0, tasks.'name' AS t1_r1, tasks.'project_id' AS t1_r2 FROM projects LEFT OUTER JOIN tasks ON tasks.project  
  3. _id = projects.id  

我们看到,使用eager loading确实只用一条SQL语句就完成工作,但是缺点是把tasks表所有的字段信息都取出来了,很多信息是 
没有用的。 

我们来看看更好的解决方案: 
Java代码   收藏代码
  1. ruby script/generate migration add_tasks_count  

我们新建一个migration,给projects表添加一个叫tasks_count的列: 
Java代码   收藏代码
  1. class AddTasksCount < ActiveRecord::Migration  
  2.   def self.up  
  3.     add_column :projects, :tasks_count, :integer, :default => 0  
  4.   
  5.     Project.reset_column_information  
  6.     Project.find(:all).each do |p|  
  7.       p.update_attribute :tasks_count, p.tasks.length  
  8.     end  
  9.   end  
  10.   
  11.   def self.down  
  12.     remove_column :projects, :tasks_count  
  13.   end  
  14. end  

我们还需要告诉Task类开启counter cache: 
Java代码   收藏代码
  1. class Task < ActiveRecord::Base  
  2.   belongs_to :projects, :counter_cache => true  
  3. end  

好了,我们把ProjectsController的index方法改回lazy loading,刷新页面,再看看log: 
Java代码   收藏代码
  1. Project Lood (0.000295)  SELECT * FROM projects  

可以看出,现在数据库只查询projects表的所有字段,查询时间也比前面的方案都短,性能大大提升。
风力发电机缺陷检测平台 风力发电机缺陷检测平台相关内容展示 阅读详情

相关推荐

Chapter 19 Digital Phase-Locked Loops

数字锁相环 Digital Phase-Locked Loops, 就是根据原来时钟信号, 产生新的时钟信号, which is locked or synchronized. (align 参考时钟边沿 or 在中间)

2304_76736886的博客 972

提升Rails应用性能:Impressionist计数器缓存(counter_cache)的正确配置方式

Impressionist是一款轻量级的Rails插件,专为跟踪页面浏览量和用户交互而设计。通过正确配置计数器缓存(counter_cache)功能,你可以显著提升应用性能,避免频繁查询数据库统计数据。本文将详细介绍如何在Rails项目中配置和使用Impressionist的计数器缓存功能,帮助你轻松实现高效的访问统计。 ## 为什么需要计数器缓存? 在Rails应用中,频繁统计模型记录的访问

gitblog_01035的博客 564

STM32 SAES硬件加密协处理器全模式工程实践指南

AES(高级加密标准)是嵌入式系统中最基础且关键的对称密码算法,其硬件加速实现直接影响安全、性能与功耗平衡。Secure AES Coprocessor(SAES)作为STMicroelectronics在STM32U5等高安全MCU中集成的专用密码协处理器,不仅支持标准ECB/CBC/CTR模式,更原生兼容GCM和CCM等认证加密模式,具备抗侧信道、密钥保护与DMA卸载能力。理解其寄存器状态机(CHMOD/MODE/CPHASE)、NPBLB数据对齐机制及GCM四阶段编程范式,是规避Tag校验失败、IV错

weixin_42311427的博客 76

counter_cache的使用

有点惭愧,做rails也2年了,竟然不会用counter_cache,刚才google了counter_cache,感觉这个还挺有用的,举个例子,在sina微博中,微博的评论数和收藏数就可以使用到counter_cache,使用了counter_cache,我们就不需要在数据库中查找该博客下的所有评论,然后再计算评论数了,举个具体的例子吧. class Blog <...

ruby 闲谈 478

PlutoSDR在matlab中的环境配置(包括驱动和硬件支持包)

双击下载到的驱动,除了点击接受协议和设置安装路径,其他只要点击下一步或者安装即可。登录或者注册你的账号,选择你的matlab版本(这里我的是2023b),点击下一步。设置安装路径,并选择我接受,点击下一步,即可安装完成,并在安装路径中得到。完成后,打开设备管理器,在端口和通用串行总线设备一栏,即可看见下图。点击进入,选择相应的系统安装包,这里我选择的Windows。可看到我们要安装的Pluto支持包,安装即可。右击桌面matlab,选择打开文件所在位置。右上角搜索pluto,选择并点击下一步。

weixin_53160338的博客 4864

【华为2021校招】笔试题【通用硬件】

时间:2020/07/15 19:00 时长:60min 题型:40单选+5多选 难度:中等 考察范围:模电、数电、SI、EMC、电源、微机原理、计算机网络、材料

Jkcia的博客 4万+

RailsCasts中文版,#23 Counter Cache Column 计数器缓存字段

和上一篇一样,咱们聚焦于ActiveRecord数据库查询性能这个话题。如下图所示,页面列出一系列项目(Project)以及其中包含的任务(Task)数。 以下是ProjectsController和index.html.erb。 class ProjectsController < ApplicationController def index @projects = Pro

边晓宇@优快云 4846

PL端:HDMI 输出实验

开发板没有HDMI编码芯片,是将FPGA的3.3差分IO直接连接到HDMI连接器,FPGA 完成 24 位 RGB 编码输出TMDS 差分信号。1、学会使用第三点IP核,首先是添加,后面的使用和自带IP核操作一致。2、主要还是在梳理vivado使用流程。

qq_43441284的博客 4287

多态下的counter_cache

[color=gray]做rails的人是幸福的,因为有时候没必要一定要看专门的api文档,在相应的rb文件里都写的很清楚;感谢脚本语言,让我们可以看到牛人们写的ruby代码。[/color] 通常做回复次数、收藏次数时,我们往往会用到rails中的计数器方法来实现,也就是增加子表相对父表的:counter_cache。 一般情况下,我们照着那本Web开发敏捷之道上做就可以了,但是,当...

难得悠闲自得 219

高通CamX架构解析(一)——核心组件与数据流设计

本文深入解析高通CamX相机架构的核心组件与数据流设计。CamX采用模块化与数据驱动思想,将复杂处理流程拆解为Node、Pipeline、Session等独立组件,并通过CHI层实现硬件接口与定制功能的分离。文章详细阐述了从请求下发到结果返回的完整数据流,并提供了实用的调试与分析指南,帮助开发者理解这一高效、灵活的现代相机架构。

k8l9m0n的博客 235

YOLO26改进 - SPPF模块 | 发论文神器!LSKA注意力改进SPPF,增强多尺度特征提取能力,高效涨点!!!

本文介绍了Large Separable Kernel Attention (LSKA)模块及其在YOLO26中的结合应用。LSKA旨在解决Visual Attention Networks (VAN)使用大内核卷积时的计算效率问题,通过将2D深度卷积层的卷积核分解为级联的水平和垂直1-D卷积核,降低了计算复杂度和内存占用,且使VAN更关注物体形状。我们将集成LSKA的SPPF_LSKA模块引入YOLO26,大量实验表明,改进后的模型在对象识别、检测、分割和稳健性测试上表现出色。

魔改工程师的博客 252

ruby on rails 学习---终于搞明白多态,大家不明白的话,可以一起交流下

一、什么叫多态关联? “多态关联”。在多态关联中,在同一个关联中,模型可以属于其他多个模型。例如,收藏模型可以属于医院、医生、药品多个模型 二、收藏(liking)——医院(hospital)、医生(physician)、药品(medication) 1、新建模型liking: 2、belongs_to :likeable, polymorphic: true, count

Jim Liang的博客 1910

YOLOv11 模型剪枝实战:深入解析通道剪枝与层剪枝的策略与实现(含环境配置、微调技巧与部署测试)

YOLOv11模型剪枝技术通过移除冗余参数和结构来压缩模型,主要包括通道剪枝和层剪枝两种方法。通道剪枝通过评估批量归一化层的缩放因子γ确定通道重要性,移除不重要的特征通道;层剪枝则直接删除整个网络层或模块。剪枝流程包括评估重要性、移除冗余成分、微调模型和评估性能四个步骤。该技术可显著降低模型计算量和参数量,适合在资源受限设备上部署高性能目标检测模型。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1960

Active Record用Counter Cache实现计

经常会有遇到这样的场景: 统计页面的访问次数 如果每次访问时都直接update数据库,对于大并发场景效率太低。由于对事务要求并不高,如访问次数数据延迟几分钟并没有太大问题,每次都操作数据库显得有点浪费。 Rails中有ActiveRecord::CounterCache专门用于这个场景。 这个类用起来很简单,只有4个方法: - (Object) decrement_c

dazhi_100的专栏 814

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

cache_count

ruby 代码 #thingsuser.rb    class Thingsuser &lt; ActiveRecord::Base        belongs_to :user       belongs_to :thing, :counter_cache =&gt; true      end   ruby 代码 #...

benson 一切皆有可能 205

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

关于has_many中:counter_cache的一些看法

在一对多的关系中,我对一个人,同时增加了三本书 如person.book.create(book1,book2,book3) 时,我发现日志里面 SELECT * FROM person WHERE (person.`id` = 2)    UPDATE products SET `book_count` = `book_count` + 1 WHERE (`id` = 2) 这样重复三次, 那...

jackdraw的专栏 239

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Spring AI + GPT-5.5 + Ollama 配置教程:Base URL、超时与流式调用

由于不同 Spring AI、Spring Boot 小版本之间仍可能存在差异,创建项目时应检查 Spring Initializr、Spring AI BOM 和官方兼容矩阵,不要直接复制旧教程中的 Starter 名称和版本号。多人项目最好隔离不同客户端,并在脱敏前提下记录最终 URL、状态码、请求耗时、请求 ID 和模型 ID。Spring AI 接入模型 API,至少要同时确认 Starter、Base URL、请求路径、API Key、模型 ID、连接超时、读取超时和流式客户端这 8 项。

2601_95893075的博客 216

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 326

【JVM】对象内存布局

HotSpot JVM 中,Java 对象内存布局由对象头(12字节,含Mark Word与压缩Klass Pointer)、实例数据及对齐填充构成,总大小为8字节倍数。对象头支持锁状态动态复用,指针压缩使引用仅4字节,但堆超32GB时失效。实例字段按类型优先级重排序以减少间隙,最小对象大小为16字节。通过JOL工具可精准验证布局,理解锁机制、GC、伪共享等底层行为。

2301_79732484的博客 147

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 113

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 190

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 352

Decorator

TaskDecorator 是异步场景下"跨线程传递上下文"的标准方案,主要用于传递 MDC、用户信息、数据源路由等上下文数据,核心价值是让异步任务的日志链路不中断、业务上下文不丢失。TaskDecorator 是 Spring 提供的一个钩子接口,用于在异步任务执行前对 Runnable 进行包装,常用于跨线程传递上下文。如果你在项目中遇到具体的异步上下文传递问题,可以把代码贴出来,我帮你给出最合适的 Decorator 方案 👍。✅ 核心能力:在线程切换时,把"父线程的上下文"搬到"子线程"

wlwork66的博客 102

JDK 下载安装:装完 Java 提示「不是内部或外部命令」?环境变量没配

JDK 是写 Java 程序必须装的东西。它包含运行 Java 的虚拟机(JRE)和编译 Java 的编译器(javac)——装了它,能跑、.java文件能编译成可执行程序。免费,学习和小规模生产都不花钱。

科小怪的博客 609

数据库乐观锁深度解析:MySQL、PostgreSQL 实战 + Spring Boot 集成指南

Oracle 提供了ORA_ROWSCN伪列(System Change Number),记录最后修改行的 SCN,类似 PostgreSQL 的xmin。实践中通常仍使用 version 字段方案,逻辑与 MySQL 完全相同。-- Oracle:通过 ORA_ROWSCN 实现乐观锁-- 更新时比对 SCN// 自定义注解// AOP 切面@Aspect@Component@Slf4jtry {

yjc_1111的专栏 392

C++ 多态详解:作用、原理与实战用法

多态是C++面向对象的核心特性,通过虚函数实现运行期动态绑定,使同一接口在不同对象上表现出不同行为。其核心作用包括统一接口、提升可扩展性、降低耦合、支持运行时分派与批量处理。实现依赖虚函数表(vtable)和虚指针(vptr),需注意虚析构函数、对象切片等陷阱。相比编译期多态(模板),运行期多态灵活性高但有调用开销。合理结合两者,可兼顾代码的灵活性与性能,是构建可扩展、低耦合系统的关键。

2402_85743155的博客 369
上一篇: Rails宝典之第二十二式: eager loading
下一篇: Rails宝典之第二十四式: Stack Trace
blacksource
博客等级 码龄20年 66粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值