Rails 3和Mongoid:嵌入式文档验证

Red*_*Red 2 ruby ruby-on-rails mongodb activemodel mongoid

所以,我在嵌入式文档中遇到了一些用户身份验证问题.我有两个文件,一个嵌入另一个.一个企业有很多成员.模型看起来像这样:

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
Run Code Online (Sandbox Code Playgroud)

问题是它没有验证每个模型中用户名的唯一性.当我在一个企业中保存一个成员时,我可以保存一千个相同的名字.这当然不适用于良好的身份验证系统.我使用的是Mongoid 2,Rails 3和Ruby 1.9

Nob*_*ita 7

这是使用嵌入式文档时的正常行为,如下所述:MongoID验证

validates_uniqueness_of

验证该字段在数据库中是唯一的:请注意,对于嵌入式文档,这将仅检查该字段在父文档的上下文中是唯一的,而不是整个数据库.

我想你想尝试在用户名字段中创建一个索引,以确保该集合的所有对象之间的唯一性.像这样的东西:

ensureIndex({username:1},{unique:true}); 
Run Code Online (Sandbox Code Playgroud)

编辑:如果您希望Mongo在存在具有相同索引值的文档时抛出异常,则必须避免Mongo执行"fire and forget"模式.这意味着当您对文档执行更新/写入操作时,数据库不会等待响应.

你想传递这个参数:safe:true.通过这样做,如果由于任何原因无法插入文档,Mongo应该引发异常.