ActiveRecord,方法链接和请求执行

时间:2015-10-05 21:59:28

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord method-chaining

我目前正在尝试了解ActiveRecord如何处理条件方法然后执行sql请求。

理解方法链接非常简单,我想到的一切都很好地解释并在这里恢复here

但是,我仍然无法弄明白并且上述文章没有解释:ActiveRecord如何知道何时执行SQL请求。

例如,如果我编码User.where(some_column: "hello").limit(5),ActiveRecord将实例化查询构建器,设置有关some_column值和有限数量结果的条件。

但是,在执行.limit(5)之后,它还会执行请求并返回结果:ActiveRecord如何知道?怎么知道它是最终的条件方法,它需要返回一个结果?它是否在每个链接条件下执行SQL请求?

在上面发布的文章中,作者通过调用正在执行请求并返回结果的最终方法each来欺骗。

1 个答案:

答案 0 :(得分:5)

limit(5)并不比where更特殊,事实上它会像ActiveRecord::Relation一样返回where。您可以交换链的顺序来证明它。

User.where(some_column: "hello").limit(5)
User.limit(5).where(some_column: "hello")

有些方法是显式调用某些方法(例如在控制器中)或隐式调用(在CLI中)触发查询的执行。这些方法例如:

  • eachselect等可用方法
  • 明确的投射方法,例如to_a
  • 查询firstlasttake
  • 等方法

每当隐式或显式调用其中一个方法时,就会执行查询。