努力了解模型中存在关联时为什么需要在Rails中进行联接/包含

Ben

我正在尝试创建一个非常复杂的查询,并且遇到了麻烦-因此,我将回到基础知识来尝试找出我所缺少的内容。我一直在阅读Rails GuidesforActive Record AssociationsActive Record Query Interface(特别是第12节-联接),但我无法理解它们之间的关系以及为什么需要联接/包含。

关联页面说:“使用Active Record关联,我们可以通过声明性地告诉Rails两种模型之间存在联系,从而简化这些操作和其他操作。” “查询”页面的12.2节说:“使用Active Record,您可以使用模型上定义的关联的名称作为快捷方式,以便在使用joins方法时为这些关联指定JOIN子句。”

这两个陈述在我看来似乎有些矛盾。如果我创建为belongs_to关联,为什么在尝试从两个表中提取数据时都需要联接?换一种方式来看:

class Customer < ActiveRecord::Base
  has_many :orders
end

class Order < ActiveRecord::Base
  belongs_to :customer
end

如果可以的话,@orders = Order.all我可以通过这样做来输出客户名称@orders.first.customer.name但是,如果我想选择名称中带有“史密斯”的所有订单,我会做类似的事情@orders=Order.where('customer.name ilike "%smith%"').joins(:customer)

这种“关系”在上半年如何运作,但是在下半年需要加入呢?

陌生人

您不需要加入,但是在您致电关联之前,不会加载您的数据。

这就是ActiveRecord::Base所谓的延迟加载。

您可以在控制台的SQL输出中看到这一点。

user = User.find(1)
User Load (0.2ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1

这个特定的用户模型具有遍历关系。

为什么都没有加载?

因为我们还没有打电话给他们。

user.articles
Article Load (0.3ms)  SELECT `articles`.* FROM `articles` WHERE `articles`.`user_id` = 1

现在我们看到查询已执行。

当使用普通的旧Ruby时,这依次成为一个问题。

例如,考虑以下内容:

users.each do |user|
  puts user.articles.first.title
end

运行以下代码是有问题的,因为Ruby每次对用户进行迭代时,它仅针对该用户调用文章。

您最终要重复查询执行以下SQL的每个用户:

Article Load (0.5ms)  SELECT `articles`.* FROM `articles` WHERE `articles`.`user_id` = 1 LIMIT 1
Article Load (0.5ms)  SELECT `articles`.* FROM `articles` WHERE `articles`.`user_id` = 2 LIMIT 1
Article Load (0.5ms)  SELECT `articles`.* FROM `articles` WHERE `articles`.`user_id` = 3 LIMIT 1
Article Load (0.5ms)  SELECT `articles`.* FROM `articles` WHERE `articles`.`user_id` = 4 LIMIT 1
Article Load (0.5ms)  SELECT `articles`.* FROM `articles` WHERE `articles`.`user_id` = 5 LIMIT 1
Article Load (0.5ms)  SELECT `articles`.* FROM `articles` WHERE `articles`.`user_id` = 6 LIMIT 1
etc.

我们可以通过在单个查询中最初加载所有数据来解决此问题。

users.joins(:articles).each do |user|
  puts user.articles.first.title
end

在枚举开始之前,它将执行以下SQL:

Article Load (0.5ms)  SELECT `articles`.* FROM `articles` WHERE `articles`.`user_id` IN(1, 2, 3, 4, 5, 6, etc.)

这是ActiveRecord::Base喜欢includesjoins起作用的方法的地方

这是关于此事的两篇好文章:

http://blog.arkency.com/2013/12/rails4-preloading/

https://rubyinrails.com/2014/01/08/what-is-lazy-loading-in-rails/

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

为什么要在compareTo(Object)中进行强制转换

来自分类Dev

不明白为什么在SQL中进行过滤需要内部联接

来自分类Dev

实体框架:为什么实体类的集合类型需要在默认构造函数中进行实例化?

来自分类Dev

为什么引用变量需要在定义时进行初始化?

来自分类Dev

为什么GetHashCode方法需要在C#中进行移位

来自分类Dev

为什么抽象变量需要在Scala中进行类型注释?

来自分类Dev

为什么拆箱需要在C#中进行显式转换?

来自分类Dev

什么时候需要在helib中进行引导?

来自分类Dev

为什么在使用OVER(PARTITION BY x)时需要在GROUP BY中包含一个字段?

来自分类Dev

为什么我们需要在RL(Q-Learning)中进行开发以实现融合?

来自分类Dev

Docker:为什么我需要在Ubuntu中进行sudo?

来自分类Dev

为什么有人以后要在NoValidate中启用约束,然后在Oracle中进行验证

来自分类Dev

为什么需要在Python的.format方法中进行显式字符串转换?

来自分类Dev

我将Ruby on Rails模型的AWS URL包含在关联模型的GET请求中时,

来自分类Dev

为什么要在实体框架中进行更新之前附加模型?

来自分类Dev

如果array字段中已经存在元素,则arrayUnion是否需要在Firestore中进行写计数?

来自分类Dev

Rails 4:联接vs包含:为什么嵌套关联会产生不同的结果?

来自分类Dev

为什么需要在结构中填充?

来自分类Dev

为什么要在循环中进行hasOwnProperty()测试

来自分类Dev

为什么我总是需要在Backbone中克隆模型属性?

来自分类Dev

谁能解释为什么我们需要在SpriteKit中进行缩放?

来自分类Dev

为什么 Moq 有时需要在 Returns 中进行显式类型声明?

来自分类Dev

为什么我需要在循环条件中包含 EOF?

来自分类Dev

为什么选择查询返回数据作为元组,我需要在 python 中关联数组

来自分类Dev

为什么我们需要在二叉树子类中进行前序、中序和后序遍历的字段?

来自分类Dev

在计算对象中的字母数时,为什么需要在增加对象之前测试该属性是否存在?

来自分类Dev

为什么 TypeScript 需要在回调中进行另一个未定义的检查?

来自分类Dev

Java 为什么在使用大括号时需要在 lambda 中进行异常处理

来自分类Dev

为什么 save() 方法需要在 django 中进行 self 参数?

Related 相关文章

  1. 1

    为什么要在compareTo(Object)中进行强制转换

  2. 2

    不明白为什么在SQL中进行过滤需要内部联接

  3. 3

    实体框架:为什么实体类的集合类型需要在默认构造函数中进行实例化?

  4. 4

    为什么引用变量需要在定义时进行初始化?

  5. 5

    为什么GetHashCode方法需要在C#中进行移位

  6. 6

    为什么抽象变量需要在Scala中进行类型注释?

  7. 7

    为什么拆箱需要在C#中进行显式转换?

  8. 8

    什么时候需要在helib中进行引导?

  9. 9

    为什么在使用OVER(PARTITION BY x)时需要在GROUP BY中包含一个字段?

  10. 10

    为什么我们需要在RL(Q-Learning)中进行开发以实现融合?

  11. 11

    Docker:为什么我需要在Ubuntu中进行sudo?

  12. 12

    为什么有人以后要在NoValidate中启用约束,然后在Oracle中进行验证

  13. 13

    为什么需要在Python的.format方法中进行显式字符串转换?

  14. 14

    我将Ruby on Rails模型的AWS URL包含在关联模型的GET请求中时,

  15. 15

    为什么要在实体框架中进行更新之前附加模型?

  16. 16

    如果array字段中已经存在元素,则arrayUnion是否需要在Firestore中进行写计数?

  17. 17

    Rails 4:联接vs包含:为什么嵌套关联会产生不同的结果?

  18. 18

    为什么需要在结构中填充?

  19. 19

    为什么要在循环中进行hasOwnProperty()测试

  20. 20

    为什么我总是需要在Backbone中克隆模型属性?

  21. 21

    谁能解释为什么我们需要在SpriteKit中进行缩放?

  22. 22

    为什么 Moq 有时需要在 Returns 中进行显式类型声明?

  23. 23

    为什么我需要在循环条件中包含 EOF?

  24. 24

    为什么选择查询返回数据作为元组,我需要在 python 中关联数组

  25. 25

    为什么我们需要在二叉树子类中进行前序、中序和后序遍历的字段?

  26. 26

    在计算对象中的字母数时,为什么需要在增加对象之前测试该属性是否存在?

  27. 27

    为什么 TypeScript 需要在回调中进行另一个未定义的检查?

  28. 28

    Java 为什么在使用大括号时需要在 lambda 中进行异常处理

  29. 29

    为什么 save() 方法需要在 django 中进行 self 参数?

热门标签

归档