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 中)触发查询的执行。这些方法例如:
each
、select
等可枚举方法
- 显式转换方法,例如
to_a
first
、last
、take
等查询方式
只要隐式或显式调用这些方法之一,就会执行查询。
我目前正在尝试了解 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 中)触发查询的执行。这些方法例如:
each
、select
等可枚举方法- 显式转换方法,例如
to_a
first
、last
、take
等查询方式
只要隐式或显式调用这些方法之一,就会执行查询。