Mutli-column unique rails index无法正常工作

时间:2017-06-15 05:33:35

标签: ruby-on-rails postgresql unique multiple-columns compound-index

我正努力想出这个:

我有一个User模型,其中包含可用于登录的电子邮件和辅助电子邮件。用户不应该拥有与其他用户相同的电子邮件/辅助电子邮件。这两列也应该是相互独特的。

发生了什么

但是,我的索引仅在自己的列中验证唯一性。因此,用户不能拥有与其他用户相同的电子邮件,并且他们不能拥有与另一个辅助电子邮件相同的辅助电子邮件。

确保两列自身唯一的索引,并为电子邮件和辅助电子邮件添加唯一索引

The index that ensures the two columns are unique with themselves

但是索引在两列中都不起作用 But I should not be able to have another user's email as my secondary email

预期

用户不应该将数据库中存在的电子邮件用作电子邮件或辅助电子邮件。

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

1 个答案:

答案 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