`
together
  • 浏览: 220302 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

分析ROR中获取关联集合size的SQL处理及疑问

    博客分类:
  • ruby
阅读更多
假设现在有两个类A,B
class A
  has_many :Bs, :class_name=>'B',:foreign_key=>'b_id'
end
a = A.find(:first)

  如果我仅想知道a.Bs.size()的话,那么在hibernate中就得单独写count语句来获取,如果使用a.getBS().size()的方式时,会先填充list,把所有Bs都初始化,也即会向数据库中发送.size()条SQL语句来初始化对象,影响性能。
  但在ror中,像上面使用a.Bs.size方法的时候,它会先判断Bs是否已经被初始化,如果已经初始化过,则直接返回Bs.size,不需要查询数据库。若尚未初始化,则发送一条count(*)语句,返回总的记录条数。这一点我感觉比hibernate要聪明。

在这个过程中发现一个有趣的现象:
N.times do
  print("a.Bs.size=#{a.Bs.size}");
end

如果a.Bs是可以获取到数据的话,那么上面语句,会发送N条count(*)的SQL。
反之如果a.Bs是空集合,数据库中根本没有相关记录的话,那么系统只会发送一条count(*)的SQL。为什么呢?

思考了一下,ROR是否是这样处理的,如果a.Bs.size>0,则它认为在下次查询时仍然需要去发送count(*)SQL。反之如果a.Bs.size==0,则它认为没必要再去发送count(*)的SQL了?但还是觉得有些离奇。
再次思考之后,是否是这样:如果第一次发现a.Bs.size>0,则它认为a.Bs是不为空的,但是先不去初始化它。而如果size==0,则它认为a.Bs是空值。直接就给a.Bs赋为空记录集了,所以再取a.Bs.size就不需要查询数据库了

另外的一点是,如果代码改成:
print((a.Bs[0] rescue nil));
N.times do
  print("a.Bs.size=#{a.Bs.size}");
end

则只会发送select * from xxx的SQL。相当于初始化了a.Bs集合。在这个基础上再计算a.Bs.size,则不会发送count(*)的SQL,直接返回a.Bs集合的长度了。

这该怎么解释才更合理呢????
分享到:
评论

相关推荐

    從 PL/SQL 中調用 ROR 创建的 Web 服务

    标题 "從 PL/SQL 中調用 ROR 创建的 Web 服务" 暗示了我们需要讨论如何在 Oracle 的 PL/SQL 环境中利用 Ruby on Rails (ROR) 构建的 Web 服务。ROR 是一个流行的开源 Web 应用框架,它基于 Ruby 语言,而 PL/SQL 则...

    RoR中文解决方案(很不错哦)

    标题中的“RoR中文解决方案”指的是Ruby on Rails(简称RoR)的一个针对中文环境的解决方案。Ruby on Rails是一个开源的Web应用程序框架,它遵循MVC(Model-View-Controller)架构模式,用Ruby语言编写,旨在使开发...

    ror中文资料

    **Ruby on Rails(简称RoR)中文资料** Ruby on Rails(RoR)是一个基于Ruby编程语言的开源Web应用框架,遵循MVC(Model-View-Controller)架构模式,旨在简化Web开发过程,提高开发效率。RoR强调“约定优于配置”...

    RoR性能优化经验谈

    同时,考虑使用异步处理,如Sidekiq或Resque,来处理耗时的操作,如邮件发送或数据分析,以避免阻塞主线程。 在代码层面,遵循DRY(Don't Repeat Yourself)原则,避免重复代码,可以减少维护成本并提高代码质量。...

    RoR选题方向—源代码

    在这个选题方向中,我们主要探讨的是与RoR相关的源代码分析和学习。源代码是理解任何编程语言或框架工作原理的关键,对于RoR来说也不例外。 在深入源代码之前,我们需要了解RoR的一些核心概念。如ActiveRecord,它...

    ror实例

    "ror实例"可能指的是在学习或实践中,通过创建一个具体的Rails应用程序来理解和掌握RoR的工作原理和最佳实践。 在Ruby on Rails中,重要知识点包括: 1. **Gemfile与Gemfile.lock**:项目中的Gemfile用于指定项目...

    ROR安装必备所有架包

    在Ruby on Rails(ROR)开发环境中,安装和配置正确的依赖包是至关重要的。这个压缩包包含了一系列用于ROR框架的基础组件,但不包括Ruby本身。让我们深入了解一下这些包的作用和重要性。 首先,`actionpack`是Rails...

    ror

    NULL 博文链接:https://xuxiangpan888.iteye.com/blog/266696

    神经网络ror resenet模型

    **神经网络Ror ResNet模型详解** 在深度学习领域,ResNet(残差网络)模型是具有里程碑意义的创新,由He et al.在2015年提出。该模型解决了深度神经网络训练中的梯度消失问题,允许构建非常深的网络结构。而“Ror”...

    ROR 文件的上传与下载

    在Ruby on Rails(简称ROR)框架下,处理文件的上传与下载是一项常见的需求,尤其是在构建包含媒体内容的应用程序时。本文将基于给定的文件信息,详细阐述如何在Rails应用中实现文件的上传与下载功能,包括数据库...

    初探ROR

    **初探ROR** Ruby on Rails(简称ROR)是一个基于Ruby编程语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在促进开发过程的简洁性和效率。Ruby on Rails的核心理念是“Don't Repeat ...

    RoR 培训课程PPT

    - **关联、验证及回调**:深入讲解ActiveRecord中的关联关系(如一对一、一对多等),以及如何进行数据验证和回调函数的应用。 - **ActionView表单**:学习如何在视图层构建动态表单,利用ActionView提供的模板...

    使用ROR编写ORACLE WEB应用

    通过分析这些源码,我们可以学习到如何在ROR中实现与Oracle数据库的交互。 “工具”标签可能指的是开发过程中使用的各种辅助工具,如数据库管理工具(如SQL Developer)、版本控制系统(如Git)、测试工具(如RSpec...

    RoRBlog 基于RoR的博客系统

    基于RoR的博客系统,代码风格简单清晰,前后太完善,适合初学者。

    ASP.NET项目移植ROR实践----DB转移(已完成)

    这一步通常需要编写SQL脚本或利用ETL(Extract, Transform, Load)工具,如SSIS(SQL Server Integration Services),将ASP.NET数据库中的数据迁移到新的ROR数据库中。在处理过程中需要注意数据类型转换,因为不同...

    ror留言板程序

    通过这个"ror留言板程序",开发者可以学习到Ruby on Rails的基础知识,如路由设置、控制器操作、模型关联、视图渲染,以及如何利用数据库进行数据交互。此外,还可以了解到测试驱动开发(TDD)的概念,以及如何组织...

Global site tag (gtag.js) - Google Analytics