3

我的 User 模型非常标准 - 它有一个 email:string 列,我在 User 模型中使用 validates :email, :unique => true 来验证它的唯一性。

为了允许用户使用备用电子邮件地址,我创建了一个新模型:

AlternateAddress,包含列 user_id:integer 和 email:string。

一个用户有_many AlternateAddresses,一个AlternateAddress 属于一个用户。 此设置生成一个简单的嵌套表单,如下所示:http ://railscasts.com/episodes/196-nested-model-form-part-1 。

我意识到我需要“一起”验证 2 个 email:string 列(一个在 User.rb 中,另一个在 AlternateAddress.rb 中) - 所以任何地方都没有重复的电子邮件地址。

我该怎么做?或者,我的整个方法论都关闭了吗?

提前致谢。

4

2 回答 2

2

如果您已经将一些电子邮件地址存储在不同的模型中,为什么不将它们全部存储在该不同的模型中,并将该email字段完全从您的User模型中移除呢?

这样,唯一性约束都可以保存在一个地方(AlternateAddress模型)。然后,一个电子邮件地址的“主要”方面可以简单地作为一个标志保存在您AlternateAddress的一个给定的 es 上User

于 2012-08-06T01:54:26.340 回答
2

您可以添加一个自定义验证器,以便它检查用户表,然后检查备用地址表:

class User < ActiveRecord::Base
  validate :email_uniqueness # custom
  validates :email, :uniqueness => true

  def email_uniqueness
    if AlternateAddress.find_by_email(self.email)
      self.errors.add(:email, "is already in use by another account")
    end
  end
end

您可以添加类似于 AlternateAddress 字段的内容。该方法是一个自定义验证器来处理备用地址,但您仍然需要普通的 rails 验证器来确保用户之间的唯一性。

于 2012-08-06T02:02:07.120 回答