ActiveRecord:大小vs计数

在Rails中,您可以使用Model.sizeModel.countfindlogging的数量。 如果你正在处理更复杂的查询,那么使用其中一种方法会有什么好处? 他们有什么不同?

例如,我有用户的照片。 如果我想显示一张用户表格和他们有多less照片,将会运行user.photos.size许多实例比user.photos.count更快或更慢。

谢谢!

你应该阅读,它仍然是有效的。

您将根据您的需要调整您使用的function。

基本上:

  • 如果你已经加载所有的条目,说User.all ,那么你应该使用length来避免另一个数据库查询

  • 如果你没有加载任何东西,请使用count在你的数据库上进行计数查询

  • 如果你不想打扰这些考虑,使用适应的size

正如其他答案所述:

  • count将执行一个SQL COUNT查询
  • 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方法。