2016-12-25 61 views
0

我最近創建了一個rails遷移,爲我的設計用戶添加一個用戶名。什麼是「null:false」真的嗎?

add_column :users, :username, :string 

我創建了一個測試帳戶,並且註冊時沒有輸入用戶名。註冊完成並創建了一個沒有用戶名的用戶。我必須解決這個問題,因爲我需要一個用戶名來設置配置文件url。所以,我在我的遷移更新爲:

add_column :users, :username, :string, null: false 

我認爲這將阻止用戶使用空用戶名創建一個帳戶 - 沒有工作!我仍然要註冊沒有用戶名。

最終加入...

 validates_presence_of :username 

...我user.rb模式固定的問題。但爲什麼沒有null:假停止它呢?我爲什麼要保留它,它是如何工作的?

回答

1

本聲明:

add_column :users, :username, :string, null: false 

準確轉換到SQL DDL(數據定義語言)標準:

ALTER TABLE users ADD username VARCHAR(255) NOT NULL; 

尾隨NOT NULLnull: false效果。您可以使用其他column modifiers,其中一些直接轉換爲DDL。

請記住,如果您已將遷移應用到數據庫,則應使用新的遷移文件進行進一步的修改。遷移更新當已經應用遷移時,Ruby文件不會傳播到數據庫模式。最終,您可以回滾上次遷移並重新運行它們,但在架構回滾期間可能會丟失現有數據。請參閱Changing Existing Migrations

+0

因此,在插入行時,如果username = null,他不應該得到數據庫約束失敗? –

+0

您不能只更新已經應用的遷移文件,並期望數據庫同步。您需要回滾migraiton並再次應用或創建一個新的修改約束。只要檢查你的數據庫模式,如果NOT NULL存在'username'。請參閱此處:http://guides.rubyonrails.org/active_record_migrations.html#changing-existing-migrations – gertas