null許容のデフォルト以外のブールフィールドを持つrailsモデルがあり、デフォルトを設定しようとしています。3-statブール問題の回避に関するブログ投稿を見つけたので、これに対応しようとしています。これは私が持っている移行です:
def change
change_column :table, is_foo, :boolean, null: false, default: false
end
データベースに既存のnull値があるため、移行の実行は失敗します。スキーマの変更を許可するために既存のエントリを更新する正しい方法は何ですか?または、null以外のコントロールをモデルに追加する必要があります。
validates :is_foo, presence: true
これを移行に追加することが「正しい」方法であるかどうかはわかりません。
Table.update_all(:is_foo => false)
同様に、このフィールドは、nullではない/デフォルトのパラメーターを追加せずに移行によって追加されました。列を追加するための移行でもこれが必要ですか、それともデフォルトで値が設定されますか?これが私が実行した移行です:
add_column :table, is_foo, :boolean
,null: false, default: false
add_columnに追加した場合、すべての値が正しく設定されていますか?
あなたはこのようにそれを行うことができます:
class UpdateFoo < ActiveRecord::Migration
def change
reversible do |direction|
direction.up {
Table.where(is_foo: nil).update_all(is_foo: false)
}
end
change_column :table, :is_foo, :boolean, null: false, default: false
end
end
移行するときまでには、すべてのことを最初に保証するヌルがに変換され、偽と、その後、あなたの制限を追加するために列を変更します。
はい、最初の移行に制限が含まれていれば、これを回避できたはずです。
モデル検証を追加するのも正しいと思います。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加