鉴于这些ActiveRecord表定义:
create_table :parents do |t|
end
create_table :children do |t|
t.references :parent
end
以及相应的型号:
class Parent < ActiveRecord::Base
has_many :children
end
class Child < ActiveRecord::Base
belongs_to :parent
end
当我创建一个具有未保存关联的未保存记录时:
parent = Parent.new
parent.children << Child.new
并询问相关记录的数量:
parent.children.count
=> 0
然后结果是0.我期待1。
我希望计数能够反映未保存和保存的相关记录。我该如何计算?
版本:
答案 0 :(得分:4)
您需要使用#size而不是#count。就像你(我,我) 发现,#count忽略内存中的记录。 #size考虑两者 已保存和未保存的记录。
以下是可用于测试其存在或计数的方法 相关记录:
<强>计数强>
count
只考虑数据库中的内容,忽略任何内容
记忆。这每次都会发出一条SQL语句,忽略任何一条
缓存。
<强>大小强>
要获取已保存和未保存的关联记录的总数,请使用
size
。此方法与length
的不同之处在于它不强制
要加载到内存中的相关记录。
<强>长度强>
要将所有关联记录加载到内存中,然后计算所有记录,请使用length
。将返回已保存和未保存记录的总数。
<强>存在吗
要查明磁盘上是否有任何记录,请忽略其存在
在内存中,使用exists?
。这每次都会发出一条SQL语句,
忽略任何缓存。
a github comment by Carlos Antonio Dasilva:
在我认为这种情况下,
长度,始终加载对象并使用Array#length
count将始终执行SQL计数
size将检查集合是否已加载,并使用它, 否则会计算。
尺寸应该能给你正确的值。