根据其他型号的电子邮件地址验证电子邮件的唯一性

时间:2014-07-29 15:31:33

标签: ruby-on-rails validation email associations

我的用户模型有" has_many" :电子邮件与电子邮件模型的关联。用户的主要电子邮件只是一个列"电子邮件"为用户。但是,我有这个关联,允许用户使用多个电子邮件地址。

问题在于,当创建新用户并且" validates_uniqueness_of:email"选中后,它仅检查其他用户的电子邮件列,而不是存储在电子邮件模型中的可能的辅助电子邮件。

我试图在我的用户模型中编写一个自定义验证方法,尝试通过给定的电子邮件地址查找用户并且它可以工作,但是它会搞砸我代码中的其他内容,比如能够添加辅助电子邮件地址或指定主要的。

有没有办法说出类似的话:" validates_uniqueness_of:电子邮件通过Email.all.each做{| e | errors.add:email,"这是无效的"如果e.email ==:email}"

这看起来非常草率,但我想要做的就是在创建用户的电子邮件地址时,根据其他模型的实例电子邮件地址验证其唯一性。

P.S。如果您对e.email感到困惑,则电子邮件是模型,它有一个列电子邮件,用于存储电子邮件地址。

2 个答案:

答案 0 :(得分:1)

听起来你需要考虑一下你的架构。我会从您的User模型中删除电子邮件列,而是使用该关联存储所有电子邮件。您可以向default模型添加Email标记,以表示用户默认电子邮件。这样您就可以将validates_uniqueness_of :email移动到Email模型,而不是尝试在多个位置进行检查。另外,它会清理您的数据,使其不在多个位置。

答案 1 :(得分:1)

您需要编写自定义验证程序。这些方面的东西:

class User 

  validates_uniqueness_of :email
  validate :email_in_use

  private

  def email_in_use
    if Email.where("lower(email) = ?", self.email.downcase).first
      errors.add(:email, "There is already a user with this email")
    end
  end

end

我同意@CWitty的说法 - 您可能需要考虑将主电子邮件地址移到“电子邮件”表中,而不是直接将其存储在用户模型中。