2016-07-26 95 views
0

所以我已經在模型中覆蓋了一個字段getter,所以在訪問該字段時它可以做一些事情,但它似乎是在我訪問字段時沒有被觸發就好像我的模型是一個Hash,例如:Getter方法被稱爲哈希時不被觸發Rails

class Group < ActiveRecord::Base 

     def field_name 
      p "Yeah printing" 
      self.field_name_before_type_cast 
     end 
end 

如果我做g = Group.first.field_name它打印在控制檯Yeah printing但如果我不g = Group.first['field_name']它只類型轉換後返回現場,並且不執行,它覆蓋的功能屬性。

我怎麼能重寫一個字段,所以當它被調用,就好像我的模型是一個散列或正常的方式,它總是返回類型轉換前的字段?

+0

我不確定它會工作,但你可以嘗試Group.first.send(:field_name)。 – BrunoFacca

+0

@BrunoFacca它按預期工作,無論如何這不是我的問題的解決方案 –

+0

爲什麼你會期望重寫一個方法改變完全不同的,不相關的方法的行爲呢? –

回答

1

你推翻了field_name方法。這改變了field_name方法的行爲。而且只有field_name方法。它不會奇蹟般地改變任何其他無關方法的行爲。

你打電話給[]方法,你沒有覆蓋。埃爾戈,其行爲不會改變。如果您想更改[]方法的行爲,則需要覆蓋[]方法,而不是其他一些不相關的方法。

[注:實際上,你沒有覆蓋它。你重寫了吧。這不是一個乾淨的方式來做到這一點,但與你的問題無關。]

我建議你重寫方法而不是覆蓋它們,並且你重寫兩個。像這樣的:

module WithPrinting 
    def field_name 
    p "Yeah printing" 
    super 
    end 

    def [](*args) 
    p "Yeah printing" if args.length == 1 && args.first == 'field_name' 
    super 
    end 
end 

class Group < ActiveRecord::Base 
    prepend WithPrinting 
end 
0

您需要同時添加讀者與作者的方法是這樣的

def field_name 
    @field_name 
end 

def field_name=(value) 
    @field_name = your_type_casting_magic(value) 
end