我的用户模型有" has_many" :电子邮件与电子邮件模型的关联。用户的主要电子邮件只是一个列"电子邮件"为用户。但是,我有这个关联,允许用户使用多个电子邮件地址。
问题在于,当创建新用户并且" validates_uniqueness_of:email"选中后,它仅检查其他用户的电子邮件列,而不是存储在电子邮件模型中的可能的辅助电子邮件。
我试图在我的用户模型中编写一个自定义验证方法,尝试通过给定的电子邮件地址查找用户并且它可以工作,但是它会搞砸我代码中的其他内容,比如能够添加辅助电子邮件地址或指定主要的。
有没有办法说出类似的话:" validates_uniqueness_of:电子邮件通过Email.all.each做{| e | errors.add:email,"这是无效的"如果e.email ==:email}"
这看起来非常草率,但我想要做的就是在创建用户的电子邮件地址时,根据其他模型的实例电子邮件地址验证其唯一性。
P.S。如果您对e.email感到困惑,则电子邮件是模型,它有一个列电子邮件,用于存储电子邮件地址。
答案 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的说法 - 您可能需要考虑将主电子邮件地址移到“电子邮件”表中,而不是直接将其存储在用户模型中。