[英]Rails migration: is it ok to use 'nil' as the default value for a boolean field?
[英]Rails migration add default not null properties to existing boolean field
我有一個 Rails 模型,它有一個可以為空的非默認布爾字段,我正在嘗試設置默認值。 我找到了一篇關於避免 3-stat boolean 問題的博客文章,所以我試圖滿足這一點。 這是我的遷移:
def change
change_column :table, is_foo, :boolean, null: false, default: false
end
由於數據庫中存在空值,運行遷移失敗。 更新現有條目以允許架構更改的正確方法是什么? 或者應該將非空控件添加到模型中:
validates :is_foo, presence: true
不確定將其添加到遷移中是否是“正確”的方式:
Table.update_all(:is_foo => false)
同樣,此字段是由遷移添加的,沒有額外的非空/默認參數。 添加列的遷移是否也需要這個,還是默認設置值? 這是我運行的遷移:
add_column :table, is_foo, :boolean
如果我在 add_column 上添加了,null: false, default: false
,所有值是否都已正確設置?
你可以這樣做:
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
向上遷移時,它將首先確保所有空值都轉換為false ,然后更改列以添加限制。
是的,如果第一次遷移包含限制,您本可以避免這種情況。
我認為您添加模型驗證也是正確的。
您實際上可以結合change_column_null和change_column_default方法在遷移中完成此操作。
change_column_null
方法允許您添加NOT NUL L 約束,最后一個參數指定用什么來替換任何現有的NULL值。
change_column_default
然后為任何新記錄設置默認值。
class UpdateTable < ActiveRecord::Migration
def change
change_column_null :table, :is_foo, false, false
change_column_default :table, :is_foo, false
end
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.