2016-01-21 36 views
1

在我的遷移文件中,我有一個值應該是唯一的變量或nil。我怎麼能實現這樣的?我目前的設置會產生各種驗證錯誤,我認爲是因爲零值不是唯一的,並且在當前設置中它希望看到一個唯一的值。遷移:如何使它成爲索引,同時仍然允許零值?

我目前有:

遷移文件:

class CreateUsers < ActiveRecord::Migration 
    def change 
    create_table :users do |t| 
     t.string :my_var 
     ... 
    end 
    end 
end 

class AddIndex < ActiveRecord::Migration 
    def change 
    add_index :users, :my_var, unique: true 
    end 
end 

型號文件:

validates :my_var, uniqueness: true 

有沒有一種方法,以允許它被nil,需要一個獨特的價值,如果它有一個價值,並使其成爲一個指數?

+0

你的意思是准許*一個*行的NULL值或任何數量的行的NULL值?無論哪種情況,您都可以擁有獨特的約束條件和/或索引。 1:http://stackoverflow.com/a/8289253/939860。 2:http://stackoverflow.com/a/20154518/939860 –

回答

2

至於你的模型驗證,你可以把它像這樣:

validates :my_var, uniqueness: { allow_nil: true } 

,或者,如果您希望包括空字符串(即""

validates :my_var, uniqueness: { allow_blank: true } 

但是,在任何情況下,你將不得不放棄你的獨特索引

編輯:索引部分可能不是必需的,如下面的評論中所述。

+0

感謝您的解釋。那麼如果我想允許'nil'值,那麼沒有辦法使它成爲索引呢?因爲這個值將被用於搜索用戶,所以使其成爲索引將肯定是有價值的。 – Nick

+0

它取決於數據庫系統,但如果我正確地記得postgresql允許在唯一索引中有多個「NULL」。如果不是,你可以使用部分或過濾索引'where my_var不爲空' – jazzytomato

+0

@Nick,那麼,你是否可以在這裏使用唯一索引是數據庫相關的。在PostgreSQL中,你可以避開它。在任何情況下,如果你的模型驗證可以執行唯一性,那麼你可以建立一個常規索引,它也可以做得很好。 – Omnigazer

相關問題