条件を使用して定義された一意制約があります。しかし、次の試験に合格しない:name_changed?
がfalseモンゴイ:「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
ので、検証は起きていないようにみえので、一意性の条件はチェックされません。
バグですか?それとも私は何かを忘れてしまった?私はそれが要素が変更されるたびに検証を実行することを避けるための最適化だと思います。
この場合、ステータスが変更されたときに検証をトリガする良い方法は何ですか?
ありがとうございます!
[mongoidドキュメント](http://mongoid.org Mongoidの#valid?は有効性のみを実行するのに対し、Active Recordの#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