gpt4 book ai didi

ruby-on-rails - rails(ActiveRecord) 如何在模型上定义类方法以及如何在需要时删除其中一个方法

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

在我的 Rails 之旅和对 Ruby 的更深入理解中,我正试图弄清楚这一点。

我所知道的是,我们可以检查一个方法是否在 ruby​​ 类中定义,方法是在对象上调用:method_defined?。因为所有的类也是 Class 类的对象 我们可以对类方法做同样的事情。例如,如果 Foo 类定义了 bar 类方法,则会发生以下情况:

Foo.method_defined? :bar #-> true

但是当对从 ActiveRecord::Base(直接或间接)继承的模型应用相同的方法时。这导致:

User.method_defined? :all #-> false
User.method_defined? :count #-> false

我可以看到 all 方法已定义 here ,我正在努力匹配点并弄清楚发生了什么。以及这些方法在未作为类方法实现时如何在模型上工作也没有任何 method_missing 的时髦业务正在进行(看起来)。

在上面,如果我能得到 Rails 为模型对象添加的实例方法的相同解释,比如 User.first.name 中的 name 方法(假设用户表有名称列)。会更好。

最后,如果我们需要的话,关于如何删除其中一种方法的一些话。

额外: 如果我还可以了解如何重置 User 类以在删除后再次定义该方法,就像我删除 count 方法与评论的建议:User.instance_eval { undef :count } 我也希望能够重新定义它。或者重置 User 类。 load 'app/models/user.rb' 不执行此处的工作。

更新: 在执行 load 'app/models/user.xml 之前取消定义模型 User 的特征类中的方法后,我想出了如何重置类。 rb' 我必须显式地执行 Object.send(:remove_const, :User) 所以 ruby​​ 完全删除类而不是加载。
仍在努力消化所有这些,尤其是 Rails 实现的工作原理。

最佳答案

这里没有魔法

module X
def test
end
end

class A
extend X
end

class B
include X
end
A.method_defined? :test #false
B.method_defined? :test #true

所以它没有定义,因为它是一个类方法,而类方法是在单例类中定义的。method_defined? 检查方法是在类中定义还是仅在其祖先中定义。

B.ancestors #[B, X, Object, Kernel, BasicObject]
A.ancestors #[A, Object, Kernel, BasicObject]

很简单,因为它是一个类方法
更新:向 How all is defined 添加更多跟踪信息

所以它类似于上面的简单代码,但使用了一些 ActiveSupport 魔法,如自动加载、egarloading 和关注点。

关于ruby-on-rails - rails(ActiveRecord) 如何在模型上定义类方法以及如何在需要时删除其中一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56716544/

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