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> 

ところで、私は別の場所で、望ましい結果が db migrations によって達成可能であることを読みましたが、私はレールに不慣れで、モデルを通じてそれを達成したいと考えています。

ありがとう

4

2 に答える 2

0

before_saveコールバックでこれが必要です。当然のことながら、コールバックは、レコードが既に保存されたafter_saveに呼び出されます。

于 2012-06-06T18:16:51.447 に答える
0

移行を変更して、デフォルトでこのブール値を false に設定します。コードがあれば、お見せします。

私はあなたが「レールに慣れていない」と読んだばかりですが、それは問題ではありません。そのレコードを真にする必要がない限り、モデルでそれを行う必要はありません。

于 2012-06-06T18:27:16.307 に答える