나는 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는 가장 안전한 것처럼 보이지만, 완전히 끔찍하게 잘못되었습니다.
다른 제안 사항이 있으십니까?
감사합니다.