【问题标题】:ActiverRecord::QueryMethods Where spawn object comes from?Activerecord::Query 方法 spawn 对象从何而来?
【发布时间】:2016-06-29 19:41:02
【问题描述】:

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

我有一个问题。 spawn 对象来自哪里?另外想问一下eager_loadincludespreload是怎么工作的。

ActiveRecord::QueryMethods

rails/activerecord/lib/active_record/relation/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 文件做了一些事情,但我找不到需要文件

我的猜测 1:ActiveRecord::SpawnMethods

rails/activerecord/lib/active_record/relation/spawn_methods.rb

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

我的猜测 2:ActiveRecord::Associations

rails/activerecord/lib/active_record/associations/collection_proxy.rb

module ActiveRecord
  module Associations
    class CollectionProxy < Relation

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

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

【问题讨论】:

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


    【解决方案1】:

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

    • Finder 方法
    • 计算
    • SpawnMethods
    • 查询方法
    • 批次
    • 解释
    • 代表团

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 2015-05-25
      • 2014-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      相关资源
      最近更新 更多