我有一个使用条件定义的唯一约束。但是,下面的测试不及格:Mongoid:验证“validates_uniqueness_of”只会在特定字段发生变化时触发
class Dummy
include Mongoid::Document
field :name, :type => String
field :status, :type => Boolean
validates_uniqueness_of :name, if: :status
end
describe "UniquenessValidator" do
let!(:d1) { Dummy.create!(name: 'NAME_1', status: true) }
let!(:d2) { Dummy.create!(name: 'NAME_1', status: false) }
it "should raise an error" do
expect {
d2.status = true
d2.save!
}.to raise_error
end
end
由于name_changed?
是假的,没有验证似乎发生,因此,唯一的条件没有被选中。
这是一个错误?或者我忘记了什么?我想这是一个优化,以避免每次修改元素时都运行验证。
在这种情况下,状态改变时触发验证的好方法是什么?
谢谢!
[该mongoid文档(http://mongoid.org /en/mongoid/docs/validation.html)指出:“当在已经存在的数据上使用#valid?时,Mongoid与Active Record的行为略有不同.Active Record的#valid?将运行所有的验证,而Mongoid的#valid?将只运行验证内存中的文档作为优化。“也许这有帮助。 –
@ p11y:确实(https://github.com/mongoid/mongoid/blob/3.1.0-stable/lib/mongoid/validations/uniqueness.rb#L289)。 hummm ... – Aymeric
肮脏的解决方法:覆盖模型 def attribute_changed?(attr) 如果attr =='name'和self.status_changed? true else super end end – Aymeric