gpt4 book ai didi

ruby-on-rails - ActiveRecord 查询的返回类型

转载 作者:行者123 更新时间:2023-12-01 02:35:38 26 4
gpt4 key购买 nike

如果我要从 ActiveRecord 调用中返回 Relation、Array 或其他类型,我会知道什么?我知道我可以在控制台中输入 .class 并弄清楚,但是调用本身是否有一些东西可以让我知道我在问什么?

最佳答案

你知道,Rails 有时会对你撒谎——所有魔术师都会:)

Rails 允许您通过链接 has_many 关联来构建复杂的查询。此功能的核心是一堆 XXXAssociation(如 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 undefs(隐藏) HasManyAssociation 实例的方法(除了少数,正如您在正则表达式中看到的那样),然后使用委托(delegate)和 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 ,它有点欺骗)。

关于ruby-on-rails - ActiveRecord 查询的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10429217/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com