簡體   English   中英

Rails 遷移將默認的非空屬性添加到現有的布爾字段

[英]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_nullchange_column_default方法在遷移中完成此操作。

  1. change_column_null方法允許您添加NOT NUL L 約束,最后一個參數指定用什么來替換任何現有的NULL值。

  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM