我正努力想出这个:
我有一个User
模型,其中包含可用于登录的电子邮件和辅助电子邮件。用户不应该拥有与其他用户相同的电子邮件/辅助电子邮件。这两列也应该是相互独特的。
发生了什么
但是,我的索引仅在自己的列中验证唯一性。因此,用户不能拥有与其他用户相同的电子邮件,并且他们不能拥有与另一个辅助电子邮件相同的辅助电子邮件。
确保两列自身唯一的索引,并为电子邮件和辅助电子邮件添加唯一索引
预期
用户不应该将数据库中存在的电子邮件用作电子邮件或辅助电子邮件。
migration.rb
class CreateUsers < ActiveRecord::Migration[5.0]
def change
create_table :users do |t|
t.string :email, null: false
t.string :secondary_email
t.timestamps
end
add_index :users, [:email, :secondary_email], unique: true
add_index :users, [:secondary_email, :email], unique: true
add_index :users, :secondary_email, unique: true
add_index :users, :email, unique: true
end
end
我已尝试过所有指数安排的组合。如果没有底部单个索引,只要用户email
是唯一的,用户就可以拥有相同的secondary_email
。
答案 0 :(得分:0)
用户不应该使用数据库中存在的电子邮件 作为电子邮件或辅助电子邮件
我能想到以避免此类情况的唯一方法是通过自定义验证。像下面的东西应该工作
class User < ActiveRecord::Base
validate :verify_unique_email_or_secondary_email
def verify_unique_email_or_secondary_email
if User.exists?("email = ? OR secondary_email = ?", email,email)
errors.add(:email, 'Email or Secondary Email has already been taken')
end
end
end