jon*_*nes 6 ruby ruby-on-rails rails-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..
Run Code Online (Sandbox Code Playgroud)
而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
Run Code Online (Sandbox Code Playgroud)
两者之间的区别在哪里?有没有办法让attr_accessor定义一个超级方法?
编辑:
我仍然不知道ActiveRecord如何定义它的方法,但我知道attr_accessor是如何做到的.而不是super我可以使用,@some_attribute因为它将值存储在同名的全局变量中:https://stackoverflow.com/a/4371458/586000
scr*_*ier 10
当您在类中使用不继承自另一个类的attr_accessor时,根据定义,"父"类中没有相同名称的方法.因此,super无处可寻找同名的方法.(嗯,您的类继承自Object,但是Object没有定义名为some_attribute的方法.)
另一方面,ActiveRecord 确实为您的属性定义了一个getter和一个setter.因此,当你再次定义它们的类(从的ActiveRecord :: Base的继承),那么Ruby有地方去(的ActiveRecord :: Base)中,当你调用超.
对比attr_accessor和ActiveRecord为您的表列生成的(许多)方法,有点像苹果和橙子的问题.ActiveRecord使用基础表上的属性执行各种操作,包括 - 但不限于 - 为表列创建getter和setter.
(以上注:ActiveRecord的作品大多通过利用使用method_missing的威力,所以很多或大部分在你的表的属性定义的方法是通过method_missing的方法实际上实现超事实上确实调用method_missing的,如果存在的话,在父类. ,这就是当你从ActiveRecord :: Base继承时,如何在some_attribute上成功调用super.)
| 归档时间: |
|
| 查看次数: |
5585 次 |
| 最近记录: |