ActiveRecord、方法链和请求执行

ActiveRecord, method chaining and request execution

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

理解方法链接非常简单,我所想的一切都在此处得到了很好的解释和恢复 here

但是,还有一点我还是想不通,上面的文章也没有解释:ActiveRecord怎么知道什么时候执行SQL请求。

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

但是,在执行了.limit(5)之后,它也执行了请求并且returns了结果:ActiveRecord怎么知道呢?它怎么知道它是最终条件方法并且需要 return 结果?它是否在每个链接条件下执行 SQL 请求?

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

limit(5) 并不比 where 更特别,事实上它 returns 和 ActiveRecord::Relation 就像 where 一样。你可以交换链的顺序来证明它。

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

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

  • eachselect等可枚举方法
  • 显式转换方法,例如to_a
  • firstlasttake
  • 等查询方式

只要隐式或显式调用这些方法之一,就会执行查询。