2013-06-05 1 views
0

singular_collection_ids 속성 (관계 유형은 has_many에서까지입니다)을 업데이트 할 수있는 양식이 레일스 앱에 있습니다. 또한 업데이트 전에 유효성을 검사해야합니다.레일 singular_collection_ids 확인

유효성 검사 문제는 이전 객체 값이 필요하지만 singular_collection_ids_was이 값을 제공 할 방법이 없습니다. 또한 singular_collection_ids 방법은 직접으로 도움이되지 않았다 그래서

self.class.find(id).singular_collection_ids 

검증 안에, 아니 임시 값을 가진 테이블을 조인 작품.

유효성 검사 단계에서 이전 값을 얻을 수있는 방법이 있습니까?

+0

무엇을이 목표로 달성하려고합니까? 아마도 'singular_collection_ids'를 사용하는 것보다 다른 방법이있을 수 있습니다. –

+0

필자의 경우 - 두 개의 모델이 있습니다 : ** 플레이어 ** 및 ** 업적 ** 그들은 ** JoinModel ** 모델을 통해 서로 링크됩니다. 따라서 플레이어와 업적 편집 폼 모두에서 링크 된 모델의 체크 박스가 있습니다. 따라서 플레이어 배열을 플레이어에게 보여 주거나 업적을 배열 할 수 있습니다. 그래서 그것은 다음과 같이 보입니다 :'Player.find (blabla) .achievement_ids = [2,3,4]'. 그리고 응용 프로그램 논리에 의해 나는이 필드 (achievement_ids 또는 player_ids)의 이전 데이터를 확인해야합니다 – exdee

+0

이 순간에 문제를 해결할 수있는 유일한 방법은 ** singular_collection_ids = ** 메소드를 오버라이드하고 이전 값을 저장하기 위해 인스턴스 변수를 추가하는 것입니다. – exdee

답변

0

확실하지 그것을 작동합니다 (그리고 그것은 확실히 황당입니다)하지만 당신이 시도 할 수 : 콜백은 어떤 오류가 발생하는 경우

class Player 

    has_many :join_models, before_remove: :prevent_achievement_removal 

    def prevent_achievement_removal(join_model) 
    errors.add(:base, "Cannot remove an achievement this way !") 
    raise ::ActiveRecord::RecordInvalid 
    end 

end 

the doc에 따르면, 기록은 제거되지 않습니다. 그러나, 뭔가 정말 이것에 대해 옳다고 생각하지 않습니다 ... 나는 더 나은 해결책에 대해 생각하려고 노력할 것입니다.

+0

같은를 찾습니다 error : base를 추가하고 false를 반환하면 아무 일도하지 않으며 예외를 발생 시키면 프로그램이 중단됩니다. 그래서 제거하기 전에 약간의 추가 이벤트 트리거이며, 유효성 검사 프로세스처럼 사용하는 방법을 모르겠습니다. – exdee

+0

** before_remove ** 이벤트는 모델의 ** before_update ** 등에서 같은 방식으로 작동하지 않습니다 (오류를 추가 할 수 있습니다. 필요하고 업데이트 작업을 무효로 만듭니다. – exdee

+0

연관 블록의 레일 가이드에 다음 텍스트가 있습니다. _ 합병 모델에서 유효성 검사, 콜백 또는 추가 속성이 필요한 경우를 통해 has_many : through를 사용해야합니다. 그러나이 문장에서 의미가 무엇인지 알지 못했습니다. – exdee