加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 与attr_accessor相比,ActiveRecord如何定义方

发布时间:2020-12-16 20:51:43 所属栏目:百科 来源:网络整理
导读:ActiveRecord似乎以不同于attr_accessor的方式定义实例方法. attr_accessor似乎没有为我的新定义属性定义超级方法: class SomeClass attr_accessor :some_attribute def some_attribute super endend some_class = SomeClass.new some_class.some_attribute
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是如何做到的.而不是super我可以使用@some_attribute,因为它将值存储在同名的全局变量中:https://stackoverflow.com/a/4371458/586000

解决方法

当您在类中使用不继承自另一个类的attr_accessor时,根据定义,“父”类中没有相同名称的方法.因此,super无处可寻找同名的方法. (好吧,你的类继承自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.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读