2011-12-28 5 views
1

나는 counter_cache 열을 사용하는 레일 2.3.14 응용 프로그램을 실행하는거야 비슷한 업데이트되지 : 내가 직접 그룹 내 작업장을 지정하면Rails counter_cache'd 연관이 update_attributes로 업데이트됩니다. counter_cache 열이

Workshop 
    belongs_to :group, :counter_cache => true 

Group 
    has_many :workshops 

을, 카운터 캐시가 잘 업데이트됩니다 . 내가 워크숍에 GROUP_ID을 대량으로 할당하는 경우

@workshop.group = Group.first 
    @workshop.save # group counter updated 

그러나, 기존의 레일 컨트롤러 스타일로, 캐시가 업데이트되지 않습니다. 나는 이것을 2.3.14의 버그로 간주한다.

def update 
    @workshop = Workshop.find(params[:id]) 

    # params[:workshop] contains a group_id assignment, thus the problem 
    if @workshop.update_attributes(params[:workshop]) 
     flash[:notice] = 'Workshop was successfully updated.' 
     # @workshop.group counter NOT updated 

은 또한 이전 버전에 존재 : 이 http://railsforum.com/viewtopic.php?id=34473

그러나, 포스터의 "솔루션"은 이중 계산 버그를 소개합니다 - 직접 할당하면, 기본 레일 업데이터를 얻을 수 있습니다 콜백 하나, 이 update_attributes에서 작동합니다.

그래서 몇 가지 작업을 수행 할 수 있습니다. 즉, params 해시에서 group_id를 제거하고 직접 할당 할 수 있습니다. 또는 워크샵 모델에서 update_attributes를 원숭이 패치를 통해 수행 할 수 있습니다.

저는 params 해시를 제거하는 것을 피하고 싶습니다. 직관적이지 않고 자체 문서화가 아니므로 @workshop.update_attributes를 호출 할 수있는 다른 사람이라면 같은 버그가 발생할 수 있습니다. Monkey-patch update_attributes는 가장 안전한 것처럼 보이지만, 완전히 끔찍하게 잘못되었습니다.

다른 제안 사항이 있으십니까?

감사합니다.

답변

1

Group.update_counters (params [: workshop] [: group_id], : workshops_count => +1) 또는 유사한 작업을 사용 하시겠습니까?

Josh Owens을 통해 내 문제를 해결 한 좋은 자료를 찾았습니다. 또한 Rails api에는 몇 가지 정보가 있습니다. 제 경우에는 귀하의 이름을 사용하여 한 그룹에서 다른 그룹으로 워크숍을 옮기고 카운터를 적절히 업데이트해야합니다.