Rails :include 与 :joins

2024-04-24

这更多的是一个“为什么事情会这样运作”的问题,而不是一个“我不知道该怎么做”的问题......

因此,提取您知道将要使用的关联记录的福音是使用:include因为您将获得连接并避免一大堆额外的查询:

Post.all(:include => :comments)

但是,当您查看日志时,没有发生连接:

Post Load (3.7ms)   SELECT * FROM "posts"
Comment Load (0.2ms)   SELECT "comments.*" FROM "comments" 
                       WHERE ("comments".post_id IN (1,2,3,4)) 
                       ORDER BY created_at asc) 

It is走捷径,因为它会立即提取所有注释,但它仍然不是联接(这就是所有文档似乎所说的)。我获得加入的唯一方法是使用:joins代替:include:

Post.all(:joins => :comments)

日志显示:

Post Load (6.0ms)  SELECT "posts".* FROM "posts" 
                   INNER JOIN "comments" ON "posts".id = "comments".post_id

我错过了什么吗?我有一个包含六个关联的应用程序,我在一个屏幕上显示所有关联的数据。似乎使用 1 个连接查询比 6 个个体更好。我知道从性能角度来看,进行联接并不总是比单独查询更好(事实上,如果您按照花费的时间计算,看起来上面的两个单独查询比联接更快),但毕竟文档我一直在读我很惊讶地看到:include不按广告宣传的那样工作。

也许是铁轨is认识到性能问题并且除某些情况外不加入?


看来:includeRails 2.1 改变了功能。 Rails 过去在所有情况下都会进行连接,但出于性能原因,它被更改为在某些情况下使用多个查询。这篇博文 http://akitaonrails.com/2008/5/26/rolling-with-rails-2-1-the-first-full-tutorial-part-2Fabio Akita 提供了有关此更改的一些很好的信息(请参阅标题为“优化的预加载”的部分)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails :include 与 :joins 的相关文章

  • 在另一个模块中扩展 Ruby 模块,包括模块方法

    每当我尝试扩展 ruby 模块时 我都会丢失模块方法 include 和extend 都不会执行此操作 考虑一下片段 module A def self say hi puts hi end end module B include A e
  • 如何获得“irb(main):001:0>”提示而不是“>>”

    我的 Mac 上预装了 Ruby 所以我想看看它 我注意到的第一件事是 irb 提示 gt gt 而不是 irb main 001 0 gt 我找不到任何关于如何通过 Google 更改此设置的信息 因为每个人都在其代码中使用 irb ma
  • 使用正则表达式惰性(不贪婪)匹配多个组

    我想获取成对之间任何值的内容
  • 如何安装wkhtmltopdf?

    现在我正在使用rails 3 0 0 我正在使用Ubuntu 11 10 64位操作系统 我想安装wkhtmltopdf 请告诉我wkhtmltopdf的静态版本 安装中wkhtmltopdf 在 Ubuntu Linux 机器上 首先使用
  • 迁移后删除轨道模型

    我觉得很奇怪 创建模型 运行迁移 销毁它 然后再次创建相同的模型会报告 SQL 异常 project master rails g model name name invoke active record create db migrate
  • 如何显示 pg-search 多重搜索结果的摘录

    我已经在 Heroku 上的 Rails 应用程序中设置了 pg search query fast PgSearch multisearch query gt
  • 如何在活动记录/Rails 4 迁移中创建具有唯一索引的新表

    如何通过 Rails 迁移创建新表并向其添加唯一索引 在文档中 我找到了如何在创建表后向表添加索引 但是如何在同一个迁移文件中同时执行这两项操作 创建表并添加唯一索引 这是完整的过程 生成迁移 rails generate migratio
  • Gem .gemspec 中的本地依赖关系

    我正在开发一个 gem Gem A 它使用了我也编写的另一个 gem Gem B 到目前为止 Gem B 已添加到 Gem A 的 gemspec 中 gem add dependency gem a gt 0 0 4 但我现在发现需要使用
  • 在 Rails 5 控制器集成测试中设置 cookie.signed

    想象一下这样的场景 有一个控制器集成测试调用一个控制器方法 其中cookie signed用于一些完整性检查 控制器 app controllers foo controller rb def index entity FooEntity
  • 将类添加到 link_to 会破坏链接

    我在 RoR 3 中使用 link to 当我像这样使用它时 它工作得很好 但我也想通过一门课 但是 这对我不起作用 该类有效 但它破坏了链接 有任何想法吗
  • 用 ruby​​ 解决旅行商问题(50 多个位置)

    我在一家快递公司工作 目前 我们 手动 解决了 50 多个地点的路线 我一直在考虑使用 Google Maps API 来解决这个问题 但我读到有 24 点的限制 目前我们在服务器中使用 Rails 因此我正在考虑使用 ruby 脚本来获取
  • 将内部联接和 where 子句添加到 INSERT INTO ON DUPLICATE KEY UPDATE

    我从 INSERT INTO ON DUPLICATE KEY UPDATE MySQL 语句开始 INSERT INTO Table1 field1 field2 VALUES 1 2 ON DUPLICATE KEY UPDATE fi
  • 如何使用 RSpec & Rails 4 测试子域约束

    我正在尝试编写一个测试子域约束的 控制器测试 但是 我无法让 RSpec 设置子域 并且如果子域不准确则返回错误 我正在使用 Rails 4 2 6 和 RSpec 3 4 路线 rb namespace frontend api do c
  • Ruby 中@@ 和@ 有什么区别? [复制]

    这个问题在这里已经有答案了 我刚刚开始学习 Ruby 一直无法找到关于 和 在类变量方面的区别的很好的解释 如果有人可以提供一个基本的直观示例 那就太好了 另外它们可以互换吗 前缀为的变量 是一个类变量 前缀为 是一个实例变量 在这个答案中
  • 计算 HBase 表中列族的记录数

    我正在寻找一个 HBase shell 命令来计算指定列族中的记录数 我知道我可以运行 echo scan table name hbase shell grep column family name wc l 然而 这将比标准计数命令运行
  • 创建符号数组

    有没有更干净的方法来做这样的事情 w address city state postal country map to sym gt address city state postal country 我本想 s本来可以做我想做的事 但事实
  • Ruby 枚举器链接

    在这个例子中 1 2 3 each with index map i j i j gt 0 2 6 我的理解是 既然each with index枚举器链接到map map表现得像each with index通过在块内传递索引 并返回一个
  • PHP/HTML 添加删除按钮

    我有下面的代码来从数据库中检索行 其中用户名列与基本目录名称匹配 username basename dirname FILE username mysql real escape string username result mysql
  • 无法让 Rails Server 与 MySQL 一起使用

    我正在尝试让我的 Rails 应用程序与 MySQL 一起使用 而不是默认的 SQLite 我创建了一个新项目 强制使用 MySQL 它似乎工作正常 它在 Gem 文件中添加了 gem 条目 如下所示 source https rubyge
  • 在自动触发的默认侦听器之前触发 Hibernate 自定义事件侦听器

    我创建了一个自定义 Hibernate 事件监听器 扩展了 org hibernate event PreInsertEventListener 自定义侦听器会重写 onPreInsert 方法 并在使用 DAO 将 联系人 实体保存到数据

随机推荐

  • Cocoa 脚本:返回“null”与“缺失值”

    看来 AppleScript 知道这个特殊值null 如何从基于 Cocoa 脚本的应用程序中为可编写脚本的属性返回这样的值 如果我回来nil NULL or NSNull对于来自我的基于 Cocoa 脚本的应用程序的可编写脚本的属性 ge
  • Bootstrap 右栏位于移动视图顶部

    我有一个像这样的引导页面 div class row div class col md 6 A div div class col md 6 B div div 好像 A B 因此 如果我在移动设备上查看它 A 列位于顶部 但我希望 B 列
  • 正则表达式大于零,保留 2 位小数

    我需要一个正则表达式来表示最多两位小数大于零的数值 并且个数列中可能有也可能没有零 我还应该添加 整数就可以了 请参阅下面的一些内容 但可能存在前导或尾随空格 Good values 1 0 1 1 12 123 12 92 092 092
  • 修复无效 JSON 的正则表达式

    我正在对服务进行 API 调用 但它返回无效的 JSON photo url 字段没有将 url 封装在引号中 我将它作为字符串 并尝试编写一个正则表达式来在 url 周围添加引号 我使用 Titanium 在 Javascript 中完成
  • XAMPP - 对于表“users”,用户“@”localhost”的 SELECT 命令被拒绝

    不久前 我删除并弄乱了 XAMPP 中的一些功能 我重新安装了它 并移动 重命名了我的文件夹和所有其他文件 所以我现在有了一个新的空的 xampp 目录 但是 当我尝试使用任何数据库功能时 它会出现如下错误 SELECT command d
  • Redis hash写入速度非常慢

    我面临一个非常奇怪的问题 使用 Redis 时 我的写入速度非常糟糕 在理想的情况下 写入速度应该接近 RAM 上的写入速度 这是我的基准 package redisbenchmark import redis clients jedis
  • AngularFireDatabase 不检索数据

    每当我使用 afDB list path 方法时 我都会得到以下信息 console log this items https i stack imgur com RtwkN png 我有这个例子作为我的 firebase 数据库 列表文件
  • 如何在ZF2控制器中获取baseUrl?

    在我的 zf2 控制器中 我想检索应用程序基本 URL 例如http example com 我尝试了以下调用 但它返回一个空字符串 this gt request gt getBasePath 我怎样才能得到http example co
  • QNetworkManager 默认情况下是否接受压缩回复?

    我在用Q网络管理器 https doc qt io qt qnetworkaccessmanager html从服务器获取文件 但是我不知道文件在传输过程中是否使用标准 gzip 压缩进行压缩 如果不是 如何让它们下载压缩文件 我该如何去检
  • C# 中密封类的扩展方法

    我有这个sealed class public sealed class A public string AName get set 有人可以为它编写一个扩展方法 如下所示 public static class Extensions pu
  • 如果我解决了冲突,Git 的责备会改变吗?

    我试图弄清楚合并冲突是否导致了错误 但我遇到了困难 因为我不清楚冲突解决如何影响git blame 假设我在 master 中有一个文件 a b c 我在master中修改 a d c 但同事也是如此 他们在一个单独的分支中以不同的方式对其
  • 如何将输入作为 stdin 通过管道传输到 src_block ?

    考虑 org babel 中的以下 perl 片段 它使用
  • 点击时反应获取id值

    我有以下内容 var SingleEditableModule React createClass show overlay function e console log e target attr id render function v
  • Asp.net core 2.0条件服务或条件连接字符串

    我正在使用 Asp net core 2 0 开发 Web api 现在我需要的是使用不同的连接字符串 这些字符串将在用户的标头中指定 我以前见过这个 不是直接关于这个问题 app Use async context next gt if
  • 在 ArrayAdapter 中显示自定义对象 - 简单的方法?

    我正在尝试显示蓝牙设备列表ArrayAdapter 并且想要覆盖适配器的默认功能以显示对象toString 我知道有一些解决方案可以扩展getView 方法 但我真的觉得这太复杂了 我想要的只是覆盖要显示的字符串的构建方式 对于蓝牙设备 这
  • 在 WPF 中创建平面按钮

    如何在wpf中制作按钮平面样式 我已经尝试过 BasedOn 属性 但它不起作用 这里使用已经定义的工具栏按钮样式更简单的解决方案
  • 基于任务的编程:#pragma omp task 与 #pragma omp parallel for

    考虑到 void saxpy worksharing float x float y float a int N pragma omp parallel for for int i 0 i lt N i y i y i a x i And
  • 带有文本密码输入类型的 EditText,但没有软键盘

    我想用 android inputType textPassword 创建一个 EditText 但是我也不想使用软键盘进行输入 所以我尝试将 InputMethod 设置为 null 但这也会禁用将密码渲染替换为 的 textPasswo
  • 重载“apply”方法时:光滑的错误消息“值元组不是对象的成员”

    我需要有能力创造一个User对象通过提供除id在某些情况下 使得User对象负责为自己分配一个自动生成的值 为此 我重载了伴随对象中的 apply 方法 如下所示 但这会导致编译时错误 value tupled is not a membe
  • Rails :include 与 :joins

    这更多的是一个 为什么事情会这样运作 的问题 而不是一个 我不知道该怎么做 的问题 因此 提取您知道将要使用的关联记录的福音是使用 include因为您将获得连接并避免一大堆额外的查询 Post all include gt comment