2016-07-06 50 views
0

我有一個軌道模型有一個非空默認的布爾值字段,我試圖設置一個默認值。我發現了一篇關於避免3統計布爾問題的博客文章,所以我試圖迎合這一點。這是我的遷移:Rails遷移添加默認非空屬性到現有的布爾字段

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,將所有的值已正確設置?

回答

1

你可以這樣來做:

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 

當遷移將確保:第一,所有轉換爲然後更改列添加你的限制。

是的,如果第一次遷移包含限制,您可以避免這種情況。

我認爲你也是正確的添加模型驗證。

0

實際上,您可以合併change_column_nullchange_column_default方法以在遷移中完成此操作。

  1. change_column_null方法可以讓你添加一個不NUL大號約束,最後一個參數指定什麼來替代任何現有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 
相關問題