假设您构建了一个涉及多个方法链的查询,例如
Post.where('id > 10').limit(20).order('id asc').except(:order)
我想知道幕后会发生什么?据推测,链的每个部分都有助于构建一个SQL SELECT,一旦链完成,就会执行语句,创建模型等。它如何“知道”链的末端在哪里?每个方法是否返回一个创建SQL片段的ActiveRecord :: Relation?
答案 0 :(得分:13)
你是对的,每个都返回ActiveRecord::Relation
。每个方法调用都建立在它被调用的关系上(除了第一个,显然没有任何内容可以构建,因为它没有在关系上调用),并返回它。
它“知道”链的末尾是什么,因为在您尝试操作/访问数据之前查询实际上并未执行,并且这样做(通常是隐式地)调用to_a
运行{{ 3}}