如何使用Rails验证MongoDB中跨模型的一致性



在我的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

如果你要保持模型的原样,并且必须在4个集合之间保持电子邮件的唯一性,我会在自己的集合中创建一个电子邮件模型,在电子邮件字段上定义一个唯一索引:

class Email
include Mongoid::Document
field :email, type: String
index({email: 1}, {unique: true})
end

通过这种方式,你所要做的就是尝试创建电子邮件模型。如果你成功了,你可以继续创建你想要的特定模型,因为你知道电子邮件在所有模型中都是独一无二的。(这个建议类似于@huzaifa-saifuddin的建议,但没有将所有模型组合成一个集合(

然后,唯一性方法定义将对DB进行一次调用,看起来如下:

def email_uniquness_across_models(email)
Email.create(email: email)
true
rescue
false
end

IMHO最好对DB进行一次调用以确保唯一性,而不是在大多数情况下进行4次调用以保证唯一性。

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

您可以创建一个额外的模型&集合,其工作是存储电子邮件地址,并在其中添加唯一索引。在创建新用户/admin/transporter/company时,首先在此集合中创建一个文档,如果成功,请在其他模型中使用相同的电子邮件地址。

最新更新