2012-06-06 71 views
0

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新手,並希望通過該模型完成此任務。

感謝

回答

0

更改您的遷移以將此布爾值設置爲false,作爲默認值。如果有代碼我會告訴你。

我剛剛讀到你是「新來的鐵軌」,但沒關係。您不需要在模型中執行此操作,除非您希望該記錄爲真。

+0

謝謝pjammer!在遷移過程中這樣做似乎是更實用的方法,但另一方面,似乎「軌道方式」是在模型 – billrichards

+0

中執行,因爲遷移是最難控制的,我傾向於認爲使用較少的代碼減少代碼是軌道交配。 – pjammer

0

您在before_save回調想要這個。 after_save回調被調用,不出所料,記錄已被保存。

+0

感謝xnm! 'before_save'回調會返回一個帶有id(id = nil)的錯誤。但這解釋了爲什麼'after_validation'工作... – billrichards