我想指定一個列上的唯一索引,但我也需要允許NULL
值(多個記錄可以有NULL
值)。當與PostgreSQL的測試中,我看到,我可以有1條記錄與NULL
值,但未來會造成一個問題:可以使用Rails/ActiveRecord中允許的NULL指定唯一索引?
irb(main):001:0> u=User.find(5)
User Load (111.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 5]]
=> #<User id: 5, email: "[email protected]", created_at: "2013-08-28 09:55:28", updated_at: "2013-08-28 09:55:28">
irb(main):002:0> u.email=nil
=> nil
irb(main):003:0> u.save
(1.1ms) BEGIN
User Exists (4.8ms) SELECT 1 AS one FROM "users" WHERE ("users"."email" IS NULL AND "users"."id" != 5) LIMIT 1
(1.5ms) ROLLBACK
=> false
所以,即使數據庫允許的話,Rails的第一次檢查,看是否有User
存在使用不同的編號並將email
列設置爲NULL
。有沒有一種方式,不僅數據庫可以允許它,但Rails不會像上面那樣首先檢查?
這個想法是用戶不必輸入電子郵件,但如果他們這樣做,我需要能夠通過他們的電子郵件找到用戶。我知道我可以創建另一個模型來將用戶與電子郵件相關聯,但我寧願按照上述方式進行操作。
UPDATE:這是我創造了添加email
列遷移代碼:
class AddEmailToUsers < ActiveRecord::Migration
def change
add_column :users, :email, :string
add_index :users, :email, :unique => true
end
end
而這裏的我已經加入到User
模型的代碼:
validates :email, uniqueness: true
我忘記了我已將validates
呼叫添加到User
型號。所以Rails首先檢查是有道理的。我想唯一的另一個問題是,如果數據庫具有唯一索引和NULL
字段是安全的?有沒有一種方法可以在Rails中指定我想驗證電子郵件是唯一的,除非它是nil
?
爲什麼rails會檢查用戶是否存在?它是你的用戶模型中的一些代碼還是默認行爲?你能發佈遷移代碼嗎? –
你有任何驗證?我猜測查詢即將到來驗證。 –
你們是對的,我更新了這個問題。 –