2010-08-20 2 views
4

내 응용 프로그램의 관계를 통해 has_many :가 많습니다. 나는 연결된 객체의 수와 같은 이것에 관련된 정보를 보여주는 확장 기능입니다. 사용자가 릴레이션을 업데이트 할 때마다 조인 테이블이 수정되고 필자는이 스 와이프를 잡을 수 있습니다. 테이블 항목에 가입has_many : through, cache, touch 및 counter_cache와 관련된 문제

문제는이 을 삭제하지 을 파괴했다. 관계가 사라지면이를 감지 할 수있는 방법이 없으며 캐시에서 오해의 소지가있는 정보를 표시하고 있습니다. touch => true 또는 : counter_cache => true는 부분적으로 작동합니다. 관계가 업데이트되거나 생성되면 증가합니다. 그러나 사용자가 관계를 제거하면 아무 일도 일어나지 않습니다. counter_cache가 깨졌습니다. 터치가 트리거되지 않습니다.

가비지 솔루션은 주 모델이 저장 될 때 컨트롤러의 .touch를 호출하는 것입니다. 이런 종류의 작품이지만, 실제로 비 전문가 인 것처럼 보입니다. 이것은 컨트롤러가 아닌 모델 논리에 있어야합니다.

나는 커다란 것을 놓치고있는 것처럼 느껴진다. 그러나 이것에 대해 내 머리를 기울이지 않는다. 누구나이 문제에 대한 통찰력을 가질 수 있습니까?

답변

0

체크 마크 S. 자신의 질문에 대한 답을 쓴 원숭이 패치 : How to create a full Audit log in Rails for every table?

ActiveRecord::Associations::HasManyThroughAssociation.class_eval do 
    def delete_records(records) 
    klass = @reflection.through_reflection.klass 
    records.each do |associate| 
     klass.destroy_all(construct_join_attributes(associate)) 
    end 
    end 
end 

그것은뿐만 아니라 당신의 문제에 대한 유용 할 수 있습니다. 이것은 레일 2에 있습니다. 이미 레일즈 3을 사용하고 있다면 다른 것들이 다를 수 있습니다.

1

멍키 패치 활성 레코드가 필요하지 않습니다. 연결을 정의 할 때 :dependent 옵션을 :destroy으로 설정하십시오.

class Book < ActiveRecord::Base 
    has_many :authorships, :dependent => :destroy 
    has_many :authors, :through => :authorships, :dependent => :destroy 
end 
+0

조인 모델 ('authorships')에 대한 콜백을 원하면 관련 모델 ('authors')에'dependent : : destroy'를 추가하면됩니다. – tight

관련 문제