0

更新:如果使用 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 新手,想通过模型来完成它。

谢谢

4

2 回答 2

0

您希望在before_save回调中使用它。after_save毫不奇怪,在记录已经保存后调用回调。

于 2012-06-06T18:16:51.447 回答
0

默认情况下,更改您的迁移以将此布尔值设置为 false。如果有代码我会告诉你的。

我刚刚读到你是'rails新手',但这没关系。您无需在模型中执行此操作,除非您希望该记录为真。

于 2012-06-06T18:27:16.307 回答