has_many 关系定义了一个属性,它是一个集合。它似乎能够回答有关集合大小的问题:
这个定单有多少个商品项目呢?实际上你会发现,聚合有个size()方法,它返回的就是这个
关联的对象数目。这个方法是深入到数据库在子表中执行select count(*)语句,计算外键
引用父表的相关记录数。
这个看起来是可行的。然而,如果你需要频繁的知道子项目的个数,这个额外的SQL 就
可能会是一个负担,你应该要避免。Active Record 使用了计数器缓存的技术有助于解决这
个问题。在子model 中的belongs_to 的声明,你可以要求Active Record 维护父表记录中关
联子表的记录数。这个计数是自动维护的--如果要增加一个子记录,在父表记录中的count
会自动增加,如果你删除的话,它就会被自动减数。
要激活这个特性,你只需简单的两步。首先,给在子表内belongs_to 声明
加:counter_cache 的选项。
class LineItem < ActiveRecord::Base
belongs_to :product, :counter_cache => true
end
其次,在父表定义中需要加入一个integer 列,它的名字是子表名+_count。
create table products (
id int not null auto_increment,
title varchar(100) not null,
/* . . .*/
line_items_count int default 0,
primary key (id)
);
在这个DDL 中有一点很重要。这个列必须要声明默认值为0,(或者你必须在父表记录
创建时设置为0)。如果不这样做,尽管有子表记录数,但最终你会得到null 值。
一旦你接受了这些步骤,你就会在父表记录中发现有计数器的列,它会自动跟踪子表的
记录数。
有一个与计数器缓存有关的问题。这个计数是由一个包含集合的对象来维护,并且如果
有什么往这个对象中添加会得到正确的更新。但是,你也可以在子表中直接设置连接来关联
子表和父表。这个情况下,计数器将不会得到更新。
下面是演示一个错误的做法,是把items 加入一个关联。我们手工来连接子表和父表。
注意size()属性是不正确的,直到我们强制父类去刷新集合。
product = Product.create(:title => "Programming Ruby",
:date_available => Time.now)
line_item = LineItem.new
line_item.product = product
line_item.save
puts "In memory size = #{product.line_items.size}"
puts "Refreshed size = #{product.line_items(:refresh).size}"
这是输出
In memory size = 0
Refreshed size = 1
正确的做法是把子类加到父类:
product = Product.create(:title => "Programming Ruby",
:date_available => Time.now)
product.line_items.create
puts "In memory size = #{product.line_items.size}"
puts "Refreshed size = #{product.line_items(:refresh).size}"
这次输出了正确数字。
In memory size = 1
Refreshed size = 1
分享到:
相关推荐
中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断加减计数器中断...
十三进制同步计数器是一种数字逻辑电路,主要用于在电子系统中进行计数操作,尤其在数字信号处理、计算机硬件和通信系统等领域有着广泛应用。它的工作原理基于二进制编码,能够实现从0到12的计数值循环,因为十三...
本项目以"模24计数器"为主题,通过Quartus II进行Verilog HDL(硬件描述语言)编程,旨在实现一个能从0计数到23(模24)并循环的计数器。74390是一种经典的集成芯片,常用于构建各种计数器结构,但在这里我们将使用...
计数器是数字系统中的重要组成部分,主要用于统计输入脉冲的数量。本次实验“计数器及其应用”旨在让学生掌握中规模集成计数器的逻辑功能和使用方式,并了解其扩展和应用。实验中使用的器材包括数字电子实验箱,以及...
1000进制计数器可以分解为三个独立的计数器:一个10进制计数器(用于个位),一个10进制计数器(用于十位),和一个更高位的10进制计数器(用于百位)。每个计数器内部都是由D触发器或者JK触发器等基本逻辑组件构成...
环形计数器和扭环计数器是数字系统中常用的一种移位型计数器,它们在逻辑设计和计算机硬件领域中扮演着重要角色。这两种计数器都是基于二进制位的移位操作来实现计数功能,但它们的结构和特性有所不同。 环形计数器...
该计数器的设计目的是加深我们对常用集成计数器的功能理解及其应用,掌握利用集成计数器构成任意进制计数器的一般设计方法,学会利用 Proteus 软件对模 M 的可逆计数器电路进行仿真,掌握可逆计数器电路的安装及调试...
【录像机计数器问题】录像机计数器与时间的关系是一个重要的数学建模问题,涉及到物理学、工程学以及数学的结合。这个问题的核心是理解录像机的内部工作原理,特别是磁带的移动机制和计数器的读数机制。 首先,录像...
中盈环球――皮带输送机/装车机专用计数器/计包器(新产品介绍) 1、计数准确:误差率万分之一,智能识别联包、横包、小叠包,最多识别6连包; 2、双窗口显示:同时显示单次装车数和总累计数,计数范围0-99999999...
流量计数器毕业设计 流量计数器毕业设计是自动化生产过程中的一种重要组件,旨在精确分装物料,避免人为疏忽原因致使物料出现漏装或多装的现象。本设计采用红外传感器系统,利用红外光的关断原理进行计数,能够减少...
ABB机器人在特定情况下需要更新转数计数器,这是一项重要的维护任务,旨在确保机器人的定位精度和正常运行。更新转数计数器通常在以下几个情境下进行: 1. **更换伺服电机转数计数器电池**:电池失效可能导致计数器...
模N计数器是数字系统设计中的一个重要组成部分,特别是在Verilog这样的硬件描述语言(HDL)中,它被广泛用于实现各种计数和定时功能。Verilog是一种强大的工具,允许工程师用编程的方式描述数字逻辑,然后可以被综合成...
微信小程序demo:触摸计数器(源代码+截图)微信小程序demo:触摸计数器(源代码+截图)微信小程序demo:触摸计数器(源代码+截图)微信小程序demo:触摸计数器(源代码+截图)微信小程序demo:触摸计数器(源代码+截图)微信...
VHDL中的计数器通常由两种基本结构组成:同步计数器和异步计数器。同步计数器的计数状态在时钟边沿触发,而异步计数器则不受时钟边沿限制,允许在任何时候进行状态更新。16位计数器通常采用同步计数器设计,因为这种...
在本话题中,我们主要探讨的是一个16位计数器的设计,该计数器采用了参数化设计方法。参数化设计是Verilog的一个重要特性,允许设计者在编写代码时定义可变的参数,从而实现模块的复用和灵活性。 1. **参数化设计...
集成计数器是一种数字逻辑电路,常用于数字系统中实现计数或定时功能。在本实验报告中,主要探讨了两种常见的集成计数器——74LS90,并通过Multisim软件进行了功能测试和应用拓展。 74LS90是一款双四进制同步计数器...
光电计数器是一种基于光电信号转换原理的设备,常用于测量物体的运动速度、频率或者脉冲数量。在这个“光电计数器课程设计”项目中,我们可以看到一个结合了微处理器技术、软件编程和实验验证的综合学习案例。下面将...
本项目聚焦于使用Proteus进行《数电实验》,通过74LS163等集成电路实现60进制、24进制和十二归一计数器的设计与仿真,这些计数器是数字系统中常见的时序逻辑部件。 74LS163是一款4位二进制同步加法计数器,具备异步...