2012-02-21 2 views
10

나는 변화를 추적 할 필요가 (추가 및 삭제)과 같이 설정 협회의 :레일 3 has_many가 변경 되었습니까?

has_many :listing_services 
has_many :services, through: :listing_services 

정상 속성의 경우는 after_savebefore_save 또는 l.previous_changes[attribute]l.changes[attribute]을 확인하는 것입니다 할 수있는 easist 방법.

질문은 has_many 속성에 대해 가장 좋은 방법은 무엇입니까?

답변

16

나는 changes 방법을 사용하지 않았습니다. 하지만 당신은 항상 마법 방법 <attribute_name>_changed?<attribute_name>_was을 사용할 수 있다는 확신 :

services.any? {|s| s.attribute_name_changed?} 
services.map(&:attribute_name_was) 
자세한 내용은

참조 라이언 베이츠의 railscast : #109 episode

UPDATE : 당신은 :after_delete을 통과하고 has_many-:after_add 콜백 수 있습니다 직접 협회 :

has_many :items, :after_add => :my_method_or_proc1, :after_remove => :my_method_or_proc2 

이 콜백을 사용하고 어떻게 작동하는지주의 깊게 살펴보십시오.items.build이고 items.create입니다. after_add 콜백 는 관련된 객체 구축에 한 번만 호출됩니다 그래서 당신은 items.build를 호출하는 경우 다음 ( 예를 들어 중첩 된 속성을) 부모 개체를 저장합니다. 부모가 유효성을 확인한 다음 items을 구축하면 데이터베이스에 저장되지 않으므로 after_add 콜백에 의존 할 수 없습니다. 즉, 추가 된 협회의 기록이 DB에 저장되었다고 말하는 것은 아닙니다. 따라서 전화가 items.create 일 때만 항목이 추가되고 저장됩니다. 이 설명을 이해하시기 바랍니다.

+0

관련 개체가 업데이트 된 경우에만 작동합니다. 연결된 객체가 추가되거나 제거되면 (그것은'services' 연관에 더 이상 존재하지 않기 때문에) 그것은 나를 위해 작동하지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? – morgler