【发布时间】:2017-04-26 12:18:25
【问题描述】:
您能否告诉我当我执行User.where(id: 1) 时 Active Record 是如何调用“where”的?
我正在检查 Active Record 的功能以读取源代码并通过撬动来停止进程。
我可以看到当我执行User.where(id: 1) 时,进程转到
rails/activerecord/lib/active_record/querying.rb
delegate :select, :group, :order, :except, :reorder, :limit, :offset, :joins, :left_joins, :left_outer_joins, :or,
:where, :rewhere, :preload, :eager_load, :includes, :from, :lock, :readonly,
:having, :create_with, :distinct, :references, :none, :unscope, :merge, to: :all
'where' 委托给 :all。
因此它去
rails/activerecord/lib/active_record/scoping/named.rb
def all
if current_scope
current_scope.clone
else
default_scoped
end
end
我不明白这部分。为什么它适用于所有人? 委托可以设置为类方法吗?我虽然可以委托给类变量、实例变量。
在 scoping/named.rb all 方法中的 default_scope 之后,进程转到rails/activerecord/lib/active_record/relation/query_methods.rb
def where(opts = :chain, *rest)
if :chain == opts
WhereChain.new(spawn)
elsif opts.blank?
self
else
spawn.where!(opts, *rest)
end
end
为什么? where 不是委托给:all 吗?它如何回到where(relation/query_methods.rb)?
【问题讨论】:
-
出于好奇,你为什么关心
where方法的实现? -
出于好奇,你为什么关心咖啡人为什么关心
where方法的实现? -
出于好奇,你为什么关心MrDanA为什么关心我为什么关心
where方法的实现? :) -
(蝙蝠侠的声音)MrDana 关心的不是你的定义。但是当TomLord 关心CoffeeMan 的时候,你怎么关心它!
-
@bkunzi01 我喜欢。
标签: ruby-on-rails ruby activerecord activesupport