2013-05-16 108 views
2

我有:如何验证范围的唯一性?

class Foo 
    include Mongoid::Document 

    field :year, :type => Integer, :default => Time.now.utc.year 
    field :month, :type => Integer, :default => Time.now.utc.month 
    field :day, :type => Integer, :default => Time.now.utc.day 

    validates :day, :uniqueness => { :scope => [:month,:year] } 
end 

我做了以下两次:

Foo.create(:day => 24, :year => 2013, :month => 5) 

我没有得到任何验证错误。相反,我有两个相同的记录。我究竟做错了什么?

+1

如何快速是两个会创建执行,如果他们被解雇立刻这里有个继承的竞争条件。也许最初的写入在第二次创建验证之前被缓存。我的建议是直接在mongodb中设置一个多键唯一约束。 'db.foos.ensureIndex({“day”:1,“year”:1,“month”:1},{unique:true})' –

+0

不立即。我可以等待30秒甚至几分钟,我仍然会得到重复记录。任何地方都没有竞赛状作为最后的手段,我可​​以直接在Mongodb中考虑独特的约束。不过,我希望通过Mongoid(应用层)来做到这一点。 –

+0

在生产中,如果碰到多个并发插入,可能会遇到上述竞争条件。至于手头的问题,我没有在语法上或逻辑上看到任何错误。可能的问题:'当使用#valid时,Mongoid的行为与Active Record略有不同?在已经存在的数据上。活动记录的#有效?将运行所有验证,而Mongoid的#有效?将只对内存中的文档进行验证作为优化。“http://mongoid.org/en/mongoid/docs/validation.html –

回答

0

尝试

validates_uniqueness_of :day, scope: [:month,:year]