2012-09-19 52 views
3

我在我的模型中有一個屬性存儲爲文本,但被解釋爲理性。我有這樣的方法來處理:爲什麼rails在設置後會更改_was值的類型?

def start 
    read_attribute(:start).to_r 
end 

當我設置start屬性爲新的值,該start_was helper方法返回一個字符串,而不是一個理性的,但在此之前我這樣做,它返回正確的值。爲什麼?

Loading development environment (Rails 3.2.8) 
1.9.3p194 :001 > d = Day.find(55) 
    Day Load (8.7ms) SELECT "days".* FROM "days" WHERE "days"."id" = ? LIMIT 1 [["id", 55]] 
=> #<Day id: 55, date: "2012-03-30", start: "1/2", finish: "2/2", created_at: "2012-09-18 15:16:42", updated_at: "2012-09-19 08:20:41", day_year_id: 1> 

1.9.3p194 :002 > d.start_was 
=> (1/2) 

1.9.3p194 :003 > d.start=0 
=> 0 

1.9.3p194 :004 > d.start_was 
=> "1/2" 

回答

2

我想原因是這種方法加載ActiveModel中(activemodel的-3.2.8 \ LIB \ active_model \ dirty.rb)

# Handle <tt>*_was</tt> for +method_missing+. 
def attribute_was(attr) 
    attribute_changed?(attr) ? changed_attributes[attr] : __send__(attr) 
end 

正如你看到的,如果屬性實際上並沒有改變它只是調用它自己的getter,在你的情況下點擊你的start方法進行轉換。但是,如果實際更改屬性,它會從changed_attributes存儲中讀取其原始值。

+0

啊,如果很煩人的話,那會讓人覺得很完美。 :) – Colin

+0

謝天謝地,我可以在已經是「Rational」的地方調用'to_r'這麼容易解決。 – Colin

相關問題