UPDATE: 如果使用after_validation回調,它將按需要運行(例如,false
值是持久的)。仍然想知道爲什麼,但我想這是爲我的目的解決:)Rails布爾值和回調默認爲false
對於布爾字段,我想在模型中的回調設置默認值爲false
而不是nil
。
當前當我創建新記錄時,它最初顯示的值爲false
,但隨後顯示爲nil
。
想知道這裏發生了什麼,如果期望的行爲是可能的w /回調。
這是在型號:
after_save :default_is_forsale
def default_is_forsale
self.not_for_sale = false if self.not_for_sale.nil?
end
這裏是軌道控制檯輸出(略無關位):
1.9.3p125 :001 > Item.create(name: "thing 4")
(0.1ms) begin transaction
SQL (6.4ms) INSERT INTO items [...]
(190.8ms) commit transaction
=> #<Item id: 20, name: "thing 4", not_for_sale: false>
酷,創造了新紀錄的false
的默認值。但是當我再次檢查:
1.9.3p125 :002 > Item.last
Item Load (0.3ms) SELECT [...]
=> #<Item id: 20, name: "thing 4", not_for_sale: nil>
奇怪,現在的價值是nil
。
1.9.3p125 :003 > Item.create(name: "more thing", not_for_sale: false)
(0.1ms) begin transaction
SQL (0.7ms) INSERT INTO items [...]
(225.2ms) commit transaction
=> #<Item id: 21, name: "more thing", not_for_sale: false>
檢索時,記錄仍顯示的false
1.9.3p125 :004 > Item.last
Item Load (0.3ms) SELECT [...]
=> #<Item id: 21, name: "more thing", not_for_sale: false>
其布爾值:
但是,如果我創建一個新的記錄和值明確設置爲false
,它是我所期待的作用
順便說一句,我在其他地方看過,通過數據庫遷移可以實現所需的結果,但我是rails新手,並希望通過該模型完成此任務。
感謝
謝謝pjammer!在遷移過程中這樣做似乎是更實用的方法,但另一方面,似乎「軌道方式」是在模型 – billrichards
中執行,因爲遷移是最難控制的,我傾向於認爲使用較少的代碼減少代碼是軌道交配。 – pjammer