2012-06-06 43 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