2013-01-18 41 views
6

ActiveRecord似乎定義了不同於attr_accessor的實例方法。與attr_accessor相比,ActiveRecord如何定義方法?

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

回答

11

當你使用你的類attr_accessor不從其它類繼承,還有就是,根據定義,沒有一種方法「父」類中的同名。因此,超級無處去尋找一個同名的方法。 (好吧,你的類繼承自Object,但Object沒有定義一個名爲some_attribute的方法。)

另一方面,ActiveRecord 確實爲定義了一個getter和setter屬性。因此,你的類(它繼承自ActiveRecord :: Base)再次定義它們,那麼當你調用超級時,Ruby有一個地方可以去(ActiveRecord :: Base)。

對比attr_accessor和ActiveRecord爲您的表格列生成的(許多)方法有點像蘋果和橘子這樣的問題。 ActiveRecord使用基礎表上的屬性完成各種事情,包括但不限於爲表列創建getter和setter。 (注意上面的內容:ActiveRecord的工作主要是通過利用method_missing的功能,所以在你的表屬性上定義的許多或大部分方法實際上是通過method_missing方法實現的,super實際上調用method_missing,如果它存在,在父類中,所以當你從ActiveRecord :: Base繼承時,如何成功地調用some_attribute上的超類。)

相關問題