我使用before_validation
來確保我的User
模型的狀態。ActiveRecord :: Base before_validation with conditional not triggered
before_validation :renter, if: 'resident? && active? && unit.present? && units.empty?'
當我嘗試使用新記錄時,條件爲真。
user.resident? && user.active? && user.unit.present? && user.units.empty?
=> true
而且回調在沒有條件的情況下完美運作。
但是,使用具有條件的回調不起作用。
user = User.new(resident_attr_except_resident_type)
user.save
=> false
user.errors.full_messages
=> ["Resident type can't be blank"]
user.renter
=> #<User ..., resident_type: 0> # resident_type 0 because is a enum
user.save
=> true
只是爲了澄清,該renter
方法執行以下操作:
def renter
self.resident_type = :renter
self
end
def renter!
renter.save
end
這有什麼,我很想念?
我懷疑兩件事1)有條件的和2)renter
的回報和我誤解before_validation
如何工作。
上帝不!我之前在另一個項目中這樣做,這是一個完整的噩夢。不要做?將只使用一次或兩次的方法! – fbelanger
@fbelanger:我同意Sourabh的看法,你應該給這個複雜的條件一個合適的名稱,並將其轉化爲一種方法。像這樣的條件很難閱讀,併爲其他開發人員瞭解,這是很難測試。你能否詳細說明爲什麼你認爲這是一個*完整的噩夢*? – spickermann
我不同意。這樣做會導致龐大的模型,但是出於所有錯誤的原因。這種方法永遠不會被真正重用,並且如果你正在編寫並行測試的話,這個方法很容易測試。在我看來,它更加清潔,使每次增量檢查分開並在回調中使用組合。否則,我最終會用'building_blank?','unit_blank?','active_resident?','acitve_resident_with_unit?','active_resident_with_unit_and_without_units?'等等。對於其他一切,但是,我爲此寫了一些方法。 – fbelanger