更新:如果使用 after_validation 回调,它会按需要工作(例如,false
值是持久的)。仍然想知道为什么会这样,但我想这已经解决了我的目的:)
对于布尔字段,我希望模型中的回调将默认值设置为false
而不是nil
.
目前,当我创建新记录时,它最初将值显示为false
,但随后将其显示为nil
。
想知道这里发生了什么,以及是否可以通过回调实现所需的行为。
这是在模型中:
after_save :default_is_forsale
def default_is_forsale
self.not_for_sale = false if self.not_for_sale.nil?
end
这是 rails 控制台输出(省略了不相关的位):
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
。
但是,如果我创建一个新记录并将值显式设置为false
,它的行为与我预期的一样:
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>
顺便说一句,我在其他地方读到,通过数据库迁移可以实现所需的结果,但我是 Rails 新手,想通过模型来完成它。
谢谢