为了账号安全,请及时绑定邮箱和手机立即绑定

ActiveRecord:大小与计数

ActiveRecord:大小与计数

凤凰求蛊 2019-09-19 09:09:57
在Rails中,您可以找到使用Model.size和的记录数Model.count。如果您正在处理更复杂的查询,那么使用一种方法优于另一种方法是否有任何优势?他们有什么不同?例如,我有用户的照片。如果我想显示一个用户表和他们有多少张照片,那么运行的实例user.photos.size会更快还是更慢user.photos.count?谢谢!
查看完整描述

3 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

你应该读到,它仍然有效。

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

基本上:

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

  • 如果您没有加载任何内容,请使用count对数据库进行计数查询

  • 如果您不想打扰这些考虑因素,请使用size适合的考虑因素


查看完整回答
反对 回复 2019-09-19
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

正如其他答案所述:

  • count将执行SQL COUNT查询

  • length 将计算结果数组的长度

  • size 将尝试选择最合适的两个,以避免过多的查询

但还有一件事。我们注意到一个size行为不同countlength完全不同的情况,我想我会分享它,因为它很少被忽视。

  • 如果您:counter_cachehas_many关联上使用a ,size将直接使用缓存计数,而不是进行额外查询。

    class Image < ActiveRecord::Base
      belongs_to :product, counter_cache: trueendclass Product < ActiveRecord::Base
      has_many :imagesend> 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

Rails指南中记录了这种行为,但我要么第一次错过它,要么忘了它。


查看完整回答
反对 回复 2019-09-19
?
陪伴而非守候

TA贡献1757条经验 获得超8个赞

以下策略都调用数据库来执行COUNT(*)查询。

Model.countModel.all.size

records = Model.all
records.count

以下内容不如将数据库中的所有记录加载到Ruby中那样高效,后者会计算集合的大小。

records = Model.all
records.size

如果模型具有关联并且您想要查找所属对象的数量(例如@customer.orders.size),则可以避免数据库查询(磁盘读取)。使用计数器缓存,Rails将使缓存值保持最新,并返回该值以响应该size方法。


查看完整回答
反对 回复 2019-09-19
  • 3 回答
  • 0 关注
  • 637 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信