`

在Rails中关于size,length,count三个方法的区别

阅读更多
count,size,length到底有什么区别呢?通过以下的测试结果可以发现问题:

Post.find_by_id(953125641).comments.length产生了如下的SQL语句
[4;35;1mPost Columns (0.000000)   SHOW FIELDS FROM `posts`
  Post Load (0.016000)   SELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1
  Comment Load (0.016000)   SELECT * FROM `comments` WHERE (`comments`.post_id = 953125641) 


Post.find_by_id(953125641).comments.size产生了如下的SQL语句
  Post Columns (0.000000)   SHOW FIELDS FROM `posts`
  Post Load (0.016000)   SELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1
  Comment Columns (0.000000)   SHOW FIELDS FROM `comments`
  SQL (0.015000)   SELECT count(*) AS count_all FROM `comments` WHERE (`comments`.post_id = 953125641) 


Post.find_by_id(953125641).comments.count产生了如下的SQL语句
  Post Columns (0.000000)   SHOW FIELDS FROM `posts`
  Post Load (0.015000)   SELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1
  Comment Columns (0.000000)   SHOW FIELDS FROM `comments`
  SQL (0.016000)   SELECT count(*) AS count_all FROM `comments` WHERE (`comments`.post_id = 953125641) 


@post = Post.find_by_id(953125641)
@length = @post.comments.length产生了如下的SQL语句
  Post Columns (0.000000)   SHOW FIELDS FROM `posts`
  Post Load (0.000000)   SELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1
  Comment Load (0.000000)   SELECT * FROM `comments` WHERE (`comments`.post_id = 953125641) 


    @post = Post.find_by_id(953125641)
    @length = @post.comments.size产生了如下的SQL语句
  Post Columns (0.015000)   SHOW FIELDS FROM `posts`
  Post Load (0.016000)   SELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1
  Comment Columns (0.000000)   SHOW FIELDS FROM `comments`
  SQL (0.000000)   SELECT count(*) AS count_all FROM `comments` WHERE (`comments`.post_id = 953125641) 


    @post = Post.find_by_id(953125641)
    @length = @post.comments.count产生了如下的SQL语句
  Post Columns (0.015000)   SHOW FIELDS FROM `posts`
  Post Load (0.000000)   SELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1
  Comment Columns (0.000000)   SHOW FIELDS FROM `comments`
  SQL (0.000000)   SELECT count(*) AS count_all FROM `comments` WHERE (`comments`.post_id = 953125641) 


@post = Post.find_by_id(953125641)
    @comments = @post.comments
    @length = @comments.count产生了如下的SQL语句
  Post Columns (0.000000)   SHOW FIELDS FROM `posts`
  Post Load (0.016000)   SELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1
  Comment Columns (0.000000)   SHOW FIELDS FROM `comments`
  SQL (0.000000)   SELECT count(*) AS count_all FROM `comments` WHERE (`comments`.post_id = 953125641) 
@post = Post.find_by_id(953125641)


    @comments = @post.comments
    @length = @comments.length产生了如下的SQL语句
  Post Columns (0.015000)   SHOW FIELDS FROM `posts`
  Post Load (0.000000)   SELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1
  Comment Load (0.000000)   SELECT * FROM `comments` WHERE (`comments`.post_id = 953125641) 


@post = Post.find_by_id(953125641)
    @comments = @post.comments
    @length = @comments.size产生了如下的SQL语句
  Post Columns (0.016000)   SHOW FIELDS FROM `posts`
  Post Load (0.000000)   SELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1
  Comment Columns (0.015000)   SHOW FIELDS FROM `comments`
  SQL (0.000000)   SELECT count(*) AS count_all FROM `comments` WHERE (`comments`.post_id = 953125641) 


@post = Post.find_by_id(953125641)
    @comments = @post.comments.find(:all)
    @length = @comments.size产生了如下的SQL语句
  Post Columns (0.015000)   SHOW FIELDS FROM `posts`
  Post Load (0.032000)   SELECT * FROM `posts` WHERE (`posts`.`id` = 953125641) LIMIT 1
  Comment Load (0.000000)   SELECT * FROM `comments` WHERE (`comments`.post_id = 953125641) 



由以上的测试数据表明: #count方法总是会产生count(*)的SQL语句去查询数据库,而#length方法总是取查询出的集合的个数,它总是不会产生count(*)的查询,#size方法就比较好了,如果目标集合还没有取出来,它会像#count方法一样,产生count(*)的查询,如果记录已经取出来了,它就像#length方法一样,直接读取集合的个数了。

基于以上的分析,结论:虽然以上三种方法都可以取得数据记录的个数,但是还是要根据根据实际所需要,调用相应的方法,以达到优化。


参考资料:
我发的帖子: http://www.railsforum.com/viewtopic.php?id=19593
文章:count vs length vs size  http://blog.hasmanythrough.com/2008/2/27/count-length-size
分享到:
评论
1 楼 holin 2008-06-29  
不错。平时没有太注意。一般都在用size

相关推荐

    Ruby on Rails中文指南

    在Ruby on Rails中文指南中,你将全面学习到如何利用这个强大的框架来构建动态的、数据驱动的Web应用程序。 首先,让我们深入理解Rails的核心概念: 1. **路由(Routes)**:Rails的路由系统是应用程序的导航蓝图...

    使用Aptana+Rails开发Rails Web应用(中文)

    在app目录下,你可以找到views、controllers、models等子目录,它们分别对应视图、控制器和模型三个核心组件。 接下来,我们将探讨Rails的MVC(模型-视图-控制器)架构。模型负责数据操作,视图用于展示用户界面,...

    在rails中 使用RSpec生产CHM文档

    标题 "在Rails中使用RSpec生产CHM文档" 暗示了这个话题是关于如何在Ruby on Rails(简称Rails)框架中使用RSpec测试工具来创建帮助文档,特别是以CHM(Microsoft Compiled HTML Help)格式。CHM文件是一种常见的...

    关于rails 3.1 cucumber-rails 1.2.0

    Rails 3.1 和 Cucumber-Rails 1.2.0 是两个在Web开发领域非常重要的工具,尤其对于Ruby on Rails框架的测试和自动化流程。本文将深入探讨这两个组件,以及它们如何协同工作来增强软件开发的效率和质量。 首先,...

    应用Rails进行敏捷Web开发中文第三版

    1. **安装与设置**:如何在本地环境中安装Ruby,配置Gemfile来管理依赖,以及初始化一个新的Rails项目。 2. **数据库迁移**:了解如何使用ActiveRecord的迁移工具(Migration)来修改数据库结构,如添加、删除或...

    rails中使用javascript日期控件

    在Rails开发中,JavaScript日期控件常常用于提升用户体验,让用户能方便地选择日期,而无需手动输入。这篇博文“rails中使用javascript日期控件”探讨了如何在Rails应用中集成和使用JavaScript日期选择器,以实现更...

    Rails项目源代码

    MVC模式将应用程序分为三个主要部分:模型(Model)处理数据逻辑,视图(View)负责显示用户界面,控制器(Controller)协调模型和视图的交互。在这个图片分享项目中,模型可能包括`User`(用户)、`Image`(图片)...

    Rails 中mongrel的安装

    在Rails项目中安装Mongrel通常通过RubyGems进行,这是一个Ruby的包管理器。首先确保RubyGems已经安装,然后在命令行执行以下命令: ```bash gem install mongrel ``` 安装完成后,可以通过`mongrel_rails`命令来...

    Rails101_by_rails4.0

    此外,书中还介绍了一些Rails中的高级概念,如Strong Parameters(强参数),它在Rails 4.0版本中引入,用于解决之前版本中的参数篡改问题,从而帮助开发者安全地处理外部提交的数据。 通过一系列的教学内容,包括...

    在Rails中使用SSL

    以下是关于在Rails中使用SSL的一些关键知识点: 1. **配置Rails应用**:在`config/application.rb`或`config/environments/production.rb`文件中,添加`config.force_ssl = true`来强制所有HTTP请求重定向到HTTPS。...

    rails查询学习笔记

    在Rails中,数据库查询主要通过ActiveRecord来实现,这是一个强大的ORM(对象关系映射)工具,能够将数据库表与Ruby类关联,简化数据操作。 描述中虽然没有具体信息,但我们可以推测这可能是一篇关于Rails中查询...

    rails指南 中文版

    Rails指南中文版是针对Ruby on Rails框架的一份详尽教程,旨在帮助开发者深入理解并熟练掌握这个强大的Web应用开发工具。Ruby on Rails(简称Rails)是一个基于Ruby语言的开源Web应用框架,它遵循MVC(Model-View-...

    Rails 101 入门电子书

    - 如何在Rails中实现RESTful接口。 - **案例分析**: - 分析一个典型的RESTful应用示例。 #### 九、练习作业2-在Group里面发表文章-双层RESTFul - **目标**: - 在Group中添加Post功能。 - **实现过程**: - 创建...

    Ruby On Rails中文教材(PDF)

    7. **Helper方法**:Rails提供了许多内置助手方法,帮助开发者在视图中处理复杂的逻辑和呈现数据。 8. **ActiveSupport库**:包含许多有用的工具方法和实用程序,如时间格式化、字符串操作等,大大提升了开发效率。...

    rails-assets, 在 Rails 中,资产管理的解决.zip

    rails-assets, 在 Rails 中,资产管理的解决 Rails 资产 Bundler 到 Bower 代理本自述文件涉及项目的开发方面。 访问站点了解如何在你的应用程序中使用 Rails 资产。 插件开发设置git clone git@github.com:tenex/r

    rails2-sample

    MVC是Rails的核心架构之一,这一章节将详细介绍这三个组件的作用和相互关系。模型负责与数据库交互,管理数据;视图用于展示数据给用户;控制器则处理用户请求,协调模型和视图之间的操作。了解并正确运用MVC模式是...

    rails版本区别

    Rails 2与Rails 3在配置文件方面也存在显著区别。在Rails 2中,配置信息主要存储在`config/environment.rb`文件中,其中包含了初始化过程中的各种设置,如加载路径、gem依赖和插件配置等。然而,Rails 3对此进行了...

    中文版rails教程

    在Ruby on Rails中,开发者可以快速构建功能丰富的动态网站,因为它提供了大量的内置功能和库,如数据库连接、ORM(对象关系映射)系统ActiveRecord、模板引擎ActionView以及路由系统ActionController等。...

Global site tag (gtag.js) - Google Analytics