我正在阅读ActiverRecord :: QueryMethods的Rails源代码,以了解eager_load的SQL是如何创建的。
我有一个问题。 spawn
对象来自哪里?此外,我想问一下eager_load
,includes
,preload
如何运作。
module ActiveRecord
module QueryMethods
extend ActiveSupport::Concern
class WhereChain
#leave out some codes
def eager_load(*args)
check_if_method_has_arguments!("eager_load", args)
spawn.eager_load!(*args)
#-----------------
Where spawn object comes from?
#-----------------
end
end
end
似乎spawn_methods文件做了一些事情,但我找不到require文件
module ActiveRecord
module SpawnMethods
def spawn #:nodoc:
clone
end
end
end
module ActiveRecord
module Associations
class CollectionProxy < Relation
def scope
@association.scope
end
alias spawn scope
end
end
end
**如果您有任何建议有效阅读代码,请给我一些。我会很感激的。
答案 0 :(得分:1)
module
中包含以下ActiveRecord::Relation
:( rails / activerecord / lib / active_record / relation.rb)
这使您可以连续将这些方法链接在一起,因为它们将始终返回ActiveRecord::Relation
个对象。
所以你的猜测都是正确的。当返回ActiveRecord::Relation
时,它将使用SpawnMethods
定义,当返回ActiveRecord::Associations::CollectionProxy
时,它将使用别名为scope
的{{1}}定义。
有关详细信息,请参阅ActiveRecord::Relation
Code。