ActiveRecord,方法链接和请求执行

Sim*_*non 4 ruby activerecord ruby-on-rails method-chaining ruby-on-rails-4

我目前正在尝试理解ActiveRecord如何工作以链接条件方法然后执行sql请求.

理解方法链接非常简单,我想到的一切都很好地解释并在这里重新开始.

但是,我仍然无法弄清楚,上面的文章没有解释:ActiveRecord如何知道何时执行SQL请求.

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

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

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

Sim*_*tti 5

limit(5)并不比where它更特别,实际上它返回了ActiveRecord::Relation类似的东西where.您可以交换链的顺序来证明它.

User.where(some_column: "hello").limit(5)
User.limit(5).where(some_column: "hello")
Run Code Online (Sandbox Code Playgroud)

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

  • 枚举方法如each,select
  • 显式铸造方法如 to_a
  • 查询的方法,如first,last,take

只要隐式或显式调用其中一个方法,就会执行查询.