根据另一个模型的电子邮件地址验证电子邮件的唯一性



我有一个User模型,它有一个"has_many": Email关联到一个Email模型。用户的主电子邮件只是用户的"email"列。但是,我有这个关联,允许一个用户有多个电子邮件地址。

问题是,当创建一个新用户并选中"validates_uniqueness_of:email"时,它只检查其他用户的email列,而不是存储在email模型中的可能的辅助邮件。

我试图在我的用户模型中编写一个自定义验证方法,该方法试图通过给定的电子邮件地址找到用户,并且它有效,但随后它在我的代码中搞砸了其他事情,例如能够添加辅助电子邮件地址或分配主要电子邮件地址。

是否有一种方法可以这样说:"validates_uniqueness_of:email through email .all.each do {|e| errors。"添加:email, "this is invalid" if .email ==:email}

这看起来真的很草率,但我所要做的就是在创建时根据另一个模型实例的电子邮件地址验证用户的电子邮件地址的唯一性。

注:如果你对电子邮件感到困惑,电子邮件是模型,它有一个列电子邮件,存储电子邮件地址。

您将需要编写一个自定义验证器。下面的内容:

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的观点,不过——你可能想考虑将主电子邮件地址移动到'email '表中,而不是直接存储在User模型中。

听起来您需要稍微考虑一下您的模式。我会从您的User模型中删除电子邮件列,取而代之的是使用关联存储所有电子邮件。您可以在Email模型中添加default标志,以表示用户的默认电子邮件。这将允许您将validates_uniqueness_of :email移动到Email模型,而不是尝试在多个地方检查它。此外,它清理您的数据,使它不是在多个地方。

最新更新