ActiverRecord :: QueryMethods spawn对象来自哪里?

时间:2016-06-29 19:41:03

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord

我正在阅读ActiverRecord :: QueryMethods的Rails源代码,以了解eager_load的SQL是如何创建的。

我有一个问题。 spawn对象来自哪里?此外,我想问一下eager_loadincludespreload如何运作。

的ActiveRecord :: QueryMethods

导轨/了activerecord / LIB / active_record /关系/ query_methods.rb

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文件

我的猜测1:ActiveRecord :: SpawnMethods

导轨/了activerecord / LIB / active_record /关系/ spawn_methods.rb

module ActiveRecord
  module SpawnMethods
    def spawn #:nodoc:
      clone
    end
  end
end

我的猜测2:ActiveRecord :: Associations

导轨/了activerecord / LIB / active_record /协会/ collection_proxy.rb

module ActiveRecord
  module Associations
    class CollectionProxy < Relation

      def scope
        @association.scope
      end
      alias spawn scope
    end
  end
end

**如果您有任何建议有效阅读代码,请给我一些。我会很感激的。

1 个答案:

答案 0 :(得分:1)

module中包含以下ActiveRecord::Relation :( rails / activerecord / lib / active_record / relation.rb)

  • FinderMethods
  • 计算
  • SpawnMethods
  • QueryMethods
  • 批次
  • 解释
  • 代表团

这使您可以连续将这些方法链接在一起,因为它们将始终返回ActiveRecord::Relation个对象。

所以你的猜测都是正确的。当返回ActiveRecord::Relation时,它将使用SpawnMethods定义,当返回ActiveRecord::Associations::CollectionProxy时,它将使用别名为scope的{​​{1}}定义。

有关详细信息,请参阅ActiveRecord::Relation Code