如果我要从ActiveRecord调用中获取关系,数组或其他类型,我会告诉我什么?我知道我可以在控制台中键入.class并弄清楚,但是调用本身有什么能让我知道我要的是什么吗?
答案 0 :(得分:2)
你知道,Rails有时会对你说谎 - 所有魔术师都这样做:)
Rails允许您通过链接has_many
关联来构建复杂查询。此功能的核心是一堆XXXAssocation(如HasManyAssociation
)类。
当您在.class
关联上致电has_many
时,您的呼叫实际上适用于HasManyAssociation
个实例。但这是神奇的开始:
# collection_proxy.rb
instance_methods.each { |m| undef_method m unless m.to_s =~ /^(?:nil\?|send|object_id|to_a)$|^__|^respond_to|proxy_/ }
Rails HasManyAssociation
实例的undefs(隐藏)方法(除了少数,正如你在正则表达式中看到的那样)然后使用委托和method_missing
将你的调用传递给一些底层数组(如果你试图获取记录)或关联本身(如果你正在链接你的关联):
delegate :group, :order, :limit, :joins, :where, :preload, :eager_load, :includes, :from,
:lock, :readonly, :having, :pluck, :to => :scoped
delegate :target, :load_target, :loaded?, :to => :@association
delegate :select, :find, :first, :last,
:build, :create, :create!,
:concat, :replace, :delete_all, :destroy_all, :delete, :destroy, :uniq,
:sum, :count, :size, :length, :empty?,
:any?, :many?, :include?,
:to => :@association
def method_missing(method, *args, &block)
match = DynamicFinderMatch.match(method)
if match && match.instantiator?
send(:find_or_instantiator_by_attributes, match, match.attribute_names, *args) do |r|
proxy_association.send :set_owner_attributes, r
proxy_association.send :add_to_target, r
yield(r) if block_given?
end
end
if target.respond_to?(method) || (!proxy_association.klass.respond_to?(method) && Class.respond_to?(method))
if load_target
if target.respond_to?(method)
target.send(method, *args, &block)
else
begin
super
rescue NoMethodError => e
raise e, e.message.sub(/ for #<.*$/, " via proxy for #{target}")
end
end
end
else
scoped.readonly(nil).send(method, *args, &block)
end
end
因此,HasManyAssociation
实例决定自己要处理的内容以及需要通过隐藏数组完成的内容(class
方法不是HasManyAssociation
感兴趣的内容,因此它将被调用这个隐藏的数组。结果当然是Array
,这有点欺骗。)
答案 1 :(得分:1)
根据我认为重要的知识,这是我的看法。它主要来自内存,并且通过一些小的控制台实验从头顶开始,所以我确定如果它能够通过它可以得到改善。欢迎评论,并要求。
Derived ActiveRecord class --> Record Instance
find
Derived ActiveRecord class | Relation --> Relation
where, select, joins, order, group, having, limit, offset, a scope
Derived ActiveRecord class | Relation --> Record Instance
find
Derived ActiveRecord class | Relation --> Result Array
all
Result Array --> Array
to_a
重要的是,