ActiveRecord:大小与计数

在Rails中,您可以找到使用Model.size和的记录数Model.count。如果您正在处理更复杂的查询,那么使用一种方法优于另一种方法是否有任何优势?他们有什么不同?

例如,我有用户的照片。如果我想显示一个用户表和他们有多少张照片,那么运行的实例user.photos.size会更快还是更慢user.photos.count

谢谢!


凤凰求蛊
浏览 641回答 3
3回答

眼眸繁星

你应该读到它,它仍然有效。您将根据需要调整您使用的功能。基本上:如果您已经加载了所有条目,User.all那么您应该使用length以避免另一个数据库查询如果您没有加载任何内容,请使用count对数据库进行计数查询如果您不想打扰这些考虑因素,请使用size适合的考虑因素

紫衣仙女

正如其他答案所述:count将执行SQL&nbsp;COUNT查询length&nbsp;将计算结果数组的长度size&nbsp;将尝试选择最合适的两个,以避免过多的查询但还有一件事。我们注意到一个size行为不同count/&nbsp;length完全不同的情况,我想我会分享它,因为它很少被忽视。如果您:counter_cache在has_many关联上使用a&nbsp;,size将直接使用缓存计数,而不是进行额外查询。class&nbsp;Image&nbsp;<&nbsp;ActiveRecord::Base &nbsp;&nbsp;belongs_to&nbsp;:product,&nbsp;counter_cache:&nbsp;trueendclass&nbsp;Product&nbsp;<&nbsp;ActiveRecord::Base &nbsp;&nbsp;has_many&nbsp;:imagesend>&nbsp;product&nbsp;=&nbsp;Product.first&nbsp;&nbsp;#&nbsp;query,&nbsp;load&nbsp;product&nbsp;into&nbsp;memory>&nbsp;product.images.size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;no&nbsp;query,&nbsp;reads&nbsp;the&nbsp;:images_count&nbsp;column>&nbsp;product.images.count&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;query,&nbsp;SQL&nbsp;COUNT>&nbsp;product.images.length&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;query,&nbsp;loads&nbsp;images&nbsp;into&nbsp;memoryRails指南中记录了这种行为,但我要么第一次错过它,要么忘了它。

陪伴而非守候

以下策略都调用数据库来执行COUNT(*)查询。Model.countModel.all.size records&nbsp;=&nbsp;Model.all records.count以下内容不如将数据库中的所有记录加载到Ruby中那样高效,后者会计算集合的大小。records&nbsp;=&nbsp;Model.all records.size如果模型具有关联并且您想要查找所属对象的数量(例如@customer.orders.size),则可以避免数据库查询(磁盘读取)。使用计数器缓存,Rails将使缓存值保持最新,并返回该值以响应该size方法。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Ruby