gpt4 book ai didi

ruby-on-rails - ActiveRecord 查询方法响应 - 需要除雾

转载 作者:太空宇宙 更新时间:2023-11-03 16:29:36 27 4
gpt4 key购买 nike

简介:Rails 3.2; 'a' 是一个对象和 ActiveRecord 模型,它有很多消息(也是 ActiveRecord 模型)——尽管这对我的问题来说可能不是很重要。

所以问题来了:为什么会这样,

  • irb(main):046:0> a.messages.respond_to?(:where)
    => 真

还有这个,

  • irb(main):047:0> a.messages.methods.include?(:where)
    => 错误

?

这是怎么回事?显然这里有些 Ruby 魔法,这使得这些探索对象的方法产生不同的结果;我猜,一个是查询 Array 类,另一个是查询...那个响应 :where(以及其他方法)的 thing。甚至不知道该怎么调用它。我的猜测是它正在用一些东西查询 Array 类的对象......“混合”? (想我在 Ruby 上下文中经常听到这个术语......)

最佳答案

这里的罪魁祸首可能是 method_missing

Ruby 和 Rails 的许多“神奇”方面都归功于这个漂亮的小方法。基本上,作为抛出 NoMethodError 之前的最后一搏,Ruby 对其对象调用了一个名为 method_missing 的方法。这允许 Rails(4.0 之前的版本)响应动态查找器,例如 find_by_name_and_email。在所有模型中定义所有可能的列组合是荒谬的,因此 Rails 重载了 method_missing 并在那里构建了相关的 SQL 查询。

此外,当您要使用 method_missing 响应方法调用时,您可以重写 Ruby 的 respond_to? 方法。

这是一个例子:

class Foo
def method_missing(meth, *args, &block)
if meth == :bar
puts 'yep!'
else
super
end
end

def respond_to?(meth)
if meth == :bar
true
else
super
end
end
end

foo = Foo.new
foo.methods.include?(:bar)
# => false
foo.respond_to?(:bar)
# => true

关于ruby-on-rails - ActiveRecord 查询方法响应 - 需要除雾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18304053/

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