如何使用 Rails 验证 MongoDB 中模型的唯一性?

ker*_*loz 5 ruby-on-rails mongodb mongoid

在我的 rails 应用程序中,我使用 MongoDB。我有 4 个模型,包括管理员。所有实体都有一个电子邮件地址。我需要进行验证以确保电子邮件对于所有模型都是唯一的。

除了在每个模型中搜索电子邮件之外,还有更简单/更好的方法吗?

喜欢


 def email_uniquness_across_models(email)
    User.where(email: email).exists? ||
      Admin.where(email: email).exists? ||
      Transporter.where(email: email).exists? ||
      Company.where(email: email).exists?
  end

Run Code Online (Sandbox Code Playgroud)

Udi*_*hen 3

如果您决定保持模型不变,并且必须保持 4 个集合之间电子邮件的唯一性,我将在其自己的集合中创建一个电子邮件模型,并在电子邮件字段上定义唯一索引:

class Email
  include Mongoid::Document

  field :email, type: String
  index({email: 1}, {unique: true})
end
Run Code Online (Sandbox Code Playgroud)

这样,您所要做的就是尝试创建该电子邮件模型。如果成功,您可以继续创建您想要的特定模型,因为您知道该电子邮件在所有模型中都是唯一的。(此建议与 @huzaifa-saifuddin 的建议类似,但没有将所有模型合并到一个集合中)

然后,唯一性方法定义将对数据库进行一次调用,如下所示:

def email_uniquness_across_models(email)
  Email.create(email: email)
  true
rescue
  false
end
Run Code Online (Sandbox Code Playgroud)

恕我直言,对数据库进行一次调用来确保唯一性比在大多数情况下进行 4 次调用来确保唯一性更好。

此实现将确保唯一性,但您还必须处理失败 - 这意味着处理后续模型创建失败的情况,您现在需要删除电子邮件文档,以便特定电子邮件可用。