2010-01-18 3 views
5

나는 lifecycle_id라는 열과 lifecycle_change_reason이라는 열이있는 테이블을 가지고 있습니다. lifeycle_id는 일반적으로 다른 요인에 따라 시스템에 의해 자동으로 변경되지만 특정 사용자는 라이프 사이클을 수동으로 변경할 수 있습니다. 만약 그럴 경우, 나는 그 (것)들에게 변화를위한 이유를 제공 할 것을 요구하고 싶다, 그러나 나는 그 분야를 언제나 요구하고 싶지 않다. 누구든지이 유형의 유효성 검사를 수행 할 수있는 방법에 대한 제안을 가지고 있습니까?레일즈에서 다른 필드가 편집 된 경우에만 필드의 존재 여부를 어떻게 확인합니까?

들으 :)

-C

답변

0

나는 몇 가지 방법을 볼 수 있습니다. 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 스타일 콜백을 인식하지 못합니다.

-1

컨트롤러가있는 것처럼 보입니다. 사람들이 논리를 모델에 적용하고 싶어하는 이유가 있지만, 여기서 합리적으로 생각해 봅시다. 시스템이이 값을 자동으로 변경하고 시스템에서 누군가가 수동으로 변경할 수있는 단일 지점 만 있다면,

if params[:object_name][:life_cycle_id] != @object.life_cycle_id && params[:object_name][:life_cycle_change_reason].blank? 
    flash[:error] = "You must enter a reason for changing the life cycle." 
    redirect_to :back and return false # or whatever 
end 
+0

이의 문제가 모든 좋은 유효성 검사 오류가에서 처리하지 않는되어 있지, 내 의견으로는, 단순히 같은 간단한 뭔가 컨트롤러에 이유의 존재를 강제로 모든 것을 많은 복잡성을 소개 형태. –

+0

확실하게 그 방법을 알고 있습니다. @ object.errors.add (: life_cycle_change_reason, "제공해야합니다.") Simple. – adriandz

관련 문제