更新: 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 によって達成可能であることを読みましたが、私はレールに不慣れで、モデルを通じてそれを達成したいと考えています。
ありがとう