我有一个使用条件定义的唯一约束。但是以下测试没有通过:
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?
为false,因此似乎不会进行验证,因此不会检查唯一性条件。
这是一个错误吗?还是我忘了什么?我想这是一个优化,以避免每次修改元素时运行验证。
在这种情况下,当状态发生变化时触发验证的好方法是什么?
谢谢!
答案 0 :(得分:5)
由于你是一个边缘案例,我建议你为此创建自己的验证器类,这样的事情应该有效:
class NameUniquenessValidator < Mongoid::Validatable::UniquenessValidator
private
def validation_required?(document, attribute)
return true "name" == attribute.to_s
super
end
end
class Dummy
include Mongoid::Document
field :name, :type => String
field :status, :type => Boolean
validates_with(NameUniquenessValidator, :name, if: :status)
end
答案 1 :(得分:1)
您正在更新状态字段,因此您需要验证此字段。你可以这样做:
class Dummy
include Mongoid::Document
field :name, :type => String
field :status, :type => Boolean
validates_uniqueness_of :name, if: :status
validates_uniqueness_of :status, scope: :name, if: :status
end
我不知道你是否可以在更新单个字段时强制mongoid验证所有字段。