我目前正在尝试了解ActiveRecord如何处理条件方法然后执行sql请求。
理解方法链接非常简单,我想到的一切都很好地解释并在这里恢复here。
但是,我仍然无法弄明白并且上述文章没有解释:ActiveRecord如何知道何时执行SQL请求。
例如,如果我编码User.where(some_column: "hello").limit(5)
,ActiveRecord将实例化查询构建器,设置有关some_column
值和有限数量结果的条件。
但是,在执行.limit(5)
之后,它还会执行请求并返回结果:ActiveRecord如何知道?怎么知道它是最终的条件方法,它需要返回一个结果?它是否在每个链接条件下执行SQL请求?
在上面发布的文章中,作者通过调用正在执行请求并返回结果的最终方法each
来欺骗。
答案 0 :(得分:5)
limit(5)
并不比where
更特殊,事实上它会像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
每当隐式或显式调用其中一个方法时,就会执行查询。