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