1

我正在努力解决这个问题:

我有一个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的 s,只要他们secondary_email的 s 是唯一的。

4

1 回答 1

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
于 2017-06-15T06:47:22.703 回答