与attr相比,ActiveRecord如何定义方法

ActiveRecord似乎定义了不同于attr_accessor的实例方法。

attr_accessor似乎没有为我定义的新属性定义一个超级方法

class SomeClass
  attr_accessor :some_attribute

  def some_attribute
    super
  end
end

>> some_class = SomeClass.new
>> some_class.some_attribute
NoMethodError: super: no superclass method `some_attribute' for..

鉴于ActiveRecord明确定义了一个超级方法

class SomeClass < ActiveRecord::Base
  # some_attribute is now a column in our database

  def some_attribute
    super
  end
end

>> some_class = SomeClass.new
>> some_class.some_attribute
nil

两者的区别在哪里? 有没有办法让attr_accessor定义一个超级方法?

编辑:我仍然不知道如何ActiveRecord定义它的方法,但我知道attr_accessor如何做到这一点。 因为它将值存储在同名全局变量中,所以可以使用@some_attribute而不是super :https: @some_attribute


当你在你的类中使用attr_accessor并不从另一个类继承时,根据定义,在“父”类中没有相同名称的方法。 因此,超级无处去寻找一个同名的方法。 (好吧,你的类继承自Object,但是Object没有定义一个名为some_attribute的方法。)

另一方面,ActiveRecord确实为你的属性定义了一个getter和setter。 因此,当你在你的类中再次定义它们(继承自ActiveRecord :: Base)时,当你调用super时,Ruby有一个地方可以去(ActiveRecord :: Base)。

对比attr_accessor和ActiveRecord为你的表格列产生的(许多)方法,有点像苹果和橙子那样的问题。 ActiveRecord使用基础表上的属性完成各种事情,包括但不限于为表列创建getter和setter。

(注意上面的内容:ActiveRecord主要通过利用method_missing的功能来工作,所以在表属性中定义的许多或大部分方法实际上都是通过method_missing方法实现的,super实际上在父类中调用method_missing(如果存在的话) ,所以当你从ActiveRecord :: Base继承时,你可以在some_attribute上成功调用super。)

链接地址: http://www.djcxy.com/p/25785.html

上一篇: How does ActiveRecord define methods compared to attr

下一篇: Why are setter methods not used in initialization?