首页 > 其他分享 >Rails中的includes和joins的区别与用法

Rails中的includes和joins的区别与用法

时间:2024-03-08 15:26:25浏览次数:12  
标签:companies Rails includes person joins 关联 加载

includes和joins的不同
当includes和joins的时候最重要的概念就是他们有他们的典型用例。
includes使用贪婪加载(eager loading)而joins使用懒加载(lazy loading),两者都非常有用,但是也都很容易被滥用导致程序性能降低或过度使用。
如果我们看一眼ruby on rails文档,描述includes最重要的一句话是:使用includes,Active Record确保使用最少的查询加载所有指定的连接。

换句话说,当我们的查询需要一个关联表时,两者(我们要查的表和关联表)都会被加载到内存中,这反过来在检索关联数据时会减少查询的次数。下边例子中我们检索companies表中所有关联person表的记录。

@companies = Company.includes(:persons).where(:preson=>{active: true}).all

@companies.each do |company|
   company.person.name
end

 

当我们迭代每个companies表中记录并且显示其对应person名字时,通常情况下,我们不得不每次使用单独的查询来检索person的名字。然而当我们使用includes方法时,渴望加载会把这关联的两个表加载到内存,所以这些代码只需要以此查询。很棒,对吧?

所以当我们想检索所有关联person的companies数据,但是不想显示Person表中数据的时候,使用includes会发生什么呢?这时候加载关联的表就没有必要了,这时joins就开始闪光了!

@companies = Company.joins(:persons).where(:persons => {active: true}).all

@companies.each do |company|
    company.name
end

joins方法使用懒加载(lazy loading)方式加载数据库,它只把Company表加载到内存,与Company表关联的Person表并不做要求(不加载到内存)。因此我们呢不会将冗余数据加载到内存中,虽然如果以后我们需要从同一数组变量使用Person表的数据,需要进一步的数据查询。

 

参考链接:

     https://blog.csdn.net/sxs_smile/article/details/71312268

 

标签:companies,Rails,includes,person,joins,关联,加载
From: https://www.cnblogs.com/hello-ruby/p/18061038

相关文章

  • 关于rails打印pdf prawn gem的使用
    1.安装gem  gem'prawn'gem'prawn-table' 2.由于prawn包中不支持打印中文,所以需要将windows电脑路径下的字体复制到gem的安装路径下windows字体路径:C:\Windows\Fontsgem中安装路径:/Users/zhoukong/.rvm/gems/jruby-9.0.0.0.pre1@rails4/gems/prawn-2.2.2/data/fonts......
  • 无涯教程-String.prototype.includes(searchString, position = 0)函数
    该方法确定字符串是否是给定字符串的子字符串。String.prototype.includes-语法str.includes(searchString[,position])searchString-要搜索的子字符串。position    -该字符串中开始搜索searchString的位置;默认为0。String.prototype.includes-返回值t......
  • 无涯教程-PostgreSQL - Joins(连接语句)
    PostgreSQLJoins子句用于合并数据库中两个或多个表中的记录,JOIN是一种通过使用每个表的公用值来组合两个表中的字段的方法。PostgreSQL中的联接类型是-CROSSJOININNERJOINLEFTOUTERJOINRIGHTOUTERJOINFULLOUTERJOIN在继续之前,让无涯教程考虑两个表,COMPANY和DE......
  • Rails ActionDispatch::Http::UploadedFile to File
    RailsでFileをActionDispatch::Http::UploadedFileに変換する方法require'mime/types'File.open(path)do|file|filename=File.basename(file.path),ActionDispatch::Http::UploadedFile.new(filename:filename,type:MIME::Types.type_for(filename).first......
  • Guardrails for Amazon Bedrock 基于具体使用案例与负责任 AI 政策实现定制式安全保障
    作为负责任的人工智能(AI)战略的一部分,您现在可以使用 GuardrailsforAmazonBedrock(预览版),实施专为您的用例和负责任的人工智能政策而定制的保障措施,以此促进用户与生成式人工智能应用程序之间的安全交互。亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术......
  • JetBrains RubyMine 2023.3 (macOS, Linux, Windows) - 最智能的 Ruby 与 Rails IDE
    JetBrainsRubyMine2023.3(macOS,Linux,Windows)-最智能的Ruby与RailsIDE请访问原文链接:https://sysin.org/blog/jb-rubymine-2023/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgJetBrainsRubyMine-最智能的Ruby与RailsIDE为什么选择RubyMine改......
  • CaltechCS122 笔记:Assignment 2: SQL Translation and Joins
    Assignment2:SQLTranslationandJoinsTranslationandjoinPlanNode及其子类,如图所示:......
  • js中的includes用法
    includes可用于查找数组和字符串是否包含某元素,包含返回true,否则返回false1、数组letarr=[1,2,3,4,5]arr.includes[4]//truearr.includes[9]//false2、字符串varstr="Helloworld"str.includes("world")//truestr.includes("wo")//truestr.include......
  • Patch 12419353 - 11.2.0.2.3 GI Patch Set Update (Includes Database PSU 11.2.0.2.
    Released:July19,2011,LastUpdated:August9,2011Thisdocumentisaccurateatthetimeofrelease.ForanychangesandadditionalinformationregardingGIPSU11.2.0.2.3,seetheserelateddocumentsthatareavailableatMyOracleSupport(http://supp......
  • Property ‘includes’ does not exist on type ‘any[]’.
    原文链接:https://www.longkui.site/error/property-includes-does-not-exist-on-type-any/4833/angular项目,TypeScript。项目正常跑的时候没有问题,打包项目(package)的时候开始报这个错误。然后定位到代码发现下面这样一段代码if(this.arr.includes(index)不同的人的......