因此,我在嵌入式文档中遇到了一些用户身份验证问题。我有两个文件,一个嵌入另一个。一个企业有很多成员。模型看起来像这样:
class Member
include Mongoid::Document
field :username, type: String
field :password, type: String
embedded_in :business
validates :username, :presence => true, :uniqueness => true, :length => 5..60
end
class Business
include Mongoid::Document
field :name, type: String
embeds_many :members
end
问题在于它没有验证每个模型中用户名的唯一性。当我在一个企业中保存一个成员时,我可以保存一千个相同的名字。这当然不适用于良好的身份验证系统。我使用的是Mongoid 2,Rails 3和Ruby 1.9
答案 0 :(得分:7)
这是使用嵌入式文档时的正常行为,如下所述:MongoID validation
validates_uniqueness_of
验证该字段在数据库中是唯一的:请注意 嵌入式文档,这只会检查该字段是否唯一 在父文档的上下文中,而不是整个数据库。
我认为你想尝试在用户名字段中创建一个索引,以确保该集合的所有对象之间的唯一性。像这样:
ensureIndex({username:1},{unique:true});
编辑:如果您希望Mongo在存在具有相同索引值的文档时抛出异常,则必须避免Mongo执行“即发即弃”模式。这意味着当您对文档执行更新/写入操作时,数据库不会等待响应。
您想要传递此参数:safe:true
。通过这样做,如果由于任何原因无法插入文档,Mongo应该引发异常。