ActiveRecord:大小vs计数
在Rails中,您可以使用Model.size
和Model.count
findlogging的数量。 如果你正在处理更复杂的查询,那么使用其中一种方法会有什么好处? 他们有什么不同?
例如,我有用户的照片。 如果我想显示一张用户表格和他们有多less照片,将会运行user.photos.size
许多实例比user.photos.count
更快或更慢。
谢谢!
你应该阅读,它仍然是有效的。
您将根据您的需要调整您使用的function。
基本上:
-
如果你已经加载所有的条目,说
User.all
,那么你应该使用length
来避免另一个数据库查询 -
如果你没有加载任何东西,请使用
count
在你的数据库上进行计数查询 -
如果你不想打扰这些考虑,使用适应的
size
正如其他答案所述:
-
count
将执行一个SQLCOUNT
查询 -
length
将计算结果数组的长度 -
size
会尽量挑选最合适的两个,以避免过多的查询
但还有一件事。 我们注意到一个size
行为完全不同count
/ length
,我想我会分享它,因为它很less被忽视。
-
如果在
has_many
关联上使用:counter_cache
,则size
将直接使用caching计数,而不会进行额外的查询。class Image < ActiveRecord::Base belongs_to :product, counter_cache: true end class Product < ActiveRecord::Base has_many :images end > product = Product.first # query, load product into memory > product.images.size # no query, reads the :images_count column > product.images.count # query, SQL COUNT > product.images.length # query, loads images into memory
这种行为logging在Rails指南中 ,但是我第一次错过了它或者忘记了它。
有时size
“挑错”,并返回一个散列 (这是什么count
会做)
在这种情况下,使用length
来获得一个整数,而不是散列 。
以下策略都会调用数据库来执行COUNT(*)
查询。
Model.count Model.all.size records = Model.all records.count
以下效率不如将数据库中的所有logging加载到Ruby中,然后计算集合的大小。
records = Model.all records.size
如果您的模型有关联,并且您想要查找所属对象的数量(例如@customer.orders.size
),则可以避免数据库查询(磁盘读取)。 使用计数器caching ,Rails将保持caching值保持最新状态,并返回该值来响应size
方法。