나는 몇 가지 방법을 볼 수 있습니다. I 은 테이블에 lifecycle_id_original
과 같은 다른 필드를 추가하는 것이 가장 좋습니다. 원본과 lifecycle_id이 동일하지 않은 경우
객체 (이 예에서는 멤버)가 검증
class Member < ActiveRecord::Base
belongs_to :lifecycle
validates :lifecycle_change_reason, :if => :lifecycle_changed?
before_save :reset_original_lifecycle
protected
def lifecycle_changed?
self.life_cycle_id != self.lifecycle_id_original && !self.lifecycle_id_original.nil?
end
def reset_original_lifecycle
self.lifecycle_id_original = self.lifecycle_id
end
end
이 lifecycle_change_reason 만 필요합니다 : 그런 다음 모델은이 같은 코드를 포함 할 것이다. 원래 값은 레코드가 새로 작성 될 때의 값이기 때문에 원래 값으로 사용할 수 없습니다.
그러면 저장 될 때 "원본"이 lifecycle_id와 일치하도록 설정되므로 다음 업데이트주기가 올바르게 작동합니다.
이것은 내가 원하는만큼 깨끗하지 않습니다. 내 첫 번째 생각은 attr_accessor
을 사용하여 복제본이 DB에 항상 저장되지는 않지만 레코드가로드 될 때마다 해당 값을 설정한다는 의미였습니다. ActiveRecord 모델에 대해 on_load 스타일 콜백을 인식하지 못합니다.
이의 문제가 모든 좋은 유효성 검사 오류가에서 처리하지 않는되어 있지, 내 의견으로는, 단순히 같은 간단한 뭔가 컨트롤러에 이유의 존재를 강제로 모든 것을 많은 복잡성을 소개 형태. –
확실하게 그 방법을 알고 있습니다. @ object.errors.add (: life_cycle_change_reason, "제공해야합니다.") Simple. – adriandz