Mongoid:验证“validates_uniqueness_of”仅在特定字段更改时触发

时间:2013-10-23 16:11:48

标签: ruby mongoid

我有一个使用条件定义的唯一约束。但是以下测试没有通过:

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,因此似乎不会进行验证,因此不会检查唯一性条件。

这是一个错误吗?还是我忘了什么?我想这是一个优化,以避免每次修改元素时运行验证。

在这种情况下,当状态发生变化时触发验证的好方法是什么?

谢谢!

2 个答案:

答案 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验证所有字段。