我有一個使用條件定義的唯一約束。但是,下面的測試不及格: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