RAILS:重复的键值违反了Devise的唯一约束

时间:2013-11-30 04:42:43

标签: ruby devise ruby-on-rails-4

我正在为一个RoR项目使用Devise gem,我遇到了一个问题。我有一个表继承User应该有一个电子邮件和密码,但我也有一个继承自User模型的客户模型,这个模型永远不会有密码,可能有或没有电子邮件。该电子邮件只是客户个人资料信息的字段。

def User < ActiveRecord::Base
 devise ..., :validatable
end

def Customer < User
 def email_required?
    false
  end

  def password_required?
    false
  end
end 

我的问题是,当我用空的电子邮件字段创建我的第一个客户时,它创建了一个空的电子邮件客户,但对于第二个客户我收到了错误:

  

PG ::错误:错误:重复键值违反唯一约束   “index_users_on_email”详细信息:密钥(电子邮件)=()已存在。

它尝试使用相同的空电子邮件创建其他客户。默认情况下,Devise在电子邮件上设置唯一性验证,默认值为“”。

由于

1 个答案:

答案 0 :(得分:1)

对于该特定用例,您唯一的选择是为Customer模型使用不同的表,因为email属性上的索引也适用于客户,这就是rails为您提供错误的原因。

其他(但不推荐)解决方案是从users表中删除索引,但这会对性能产生负面影响。