當我執行User.where(id: 1)
時,你能告訴我Active Record如何調用'where'嗎?ActiveRecord如何調用'where'?
我正在檢查Active Record的功能來讀取源代碼並通過pry停止進程。 我可以看到當我執行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
「其中」被委派到:所有。 因此它去 rails/activerecord/lib/active_record/scoping/named.rb
def all
if current_scope
current_scope.clone
else
default_scoped
end
end
我不明白這個部分。爲什麼這是所有? 委託可以設置爲類方法嗎?我雖然可以委託給類變量,實例變量。
在作用域/ named.rb所有的方法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'方法的實現? – MrDanA
出於好奇,你爲什麼關心爲什麼咖啡人關心「where」方法的實現? –
出於好奇,你爲什麼關心爲什麼MrDanA關心我爲什麼關心'where'方法的實現? :) –