ruby-on-rails - 多列唯一 Rails 索引无法正常工作

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

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

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

发生了什么

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


确保两列自身唯一的索引,并为email和secondary email添加唯一索引

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

期望值

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


迁移.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 是唯一的。

最佳答案

A user should not be able to use an email that exists in the database as a email or secondary email

我能想到的避免这种情况的唯一方法是进行自定义验证。像下面这样的东西应该可以工作

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

关于ruby-on-rails - 多列唯一 Rails 索引无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44559282/

相关文章:

javascript - 错误 : The Content-Range header is missing in the HTTP Response

java - 防止每次读取时发生 DataNucleus 事务

r - 对于 R data.table,如何使用 uniqueN() 来计算多列中的唯一/不同值?

mongodb - 如何确保基于特定字段的数组中的唯一项 - mongoDB?

ruby-on-rails - 如何将 rails 事件资源对象转换为哈希?

ruby-on-rails - 使用 Ruby 或 RubyOnRails 连接到共享点服务器

ruby-on-rails - 半固定 : Missing `secret_key_base` for 'production' environment

postgresql - 在postgres中将一列转换为多列

sql - PostgreSQL,检查相对于 "today"的日期

java - JPA:列在其父级中应该是唯一的。