2009-06-08 2 views
1

작업 일이 소요되었습니다.컨트롤러에서 ActiveRecord 연결을 다시로드 할 수 없습니다.

나는

class Box 
    has_many :users, :through => :subscriptions 
end 

내가 신속하게 자신의 일을 여러 INSERT를 사용하는 사용자 정의 insert_new_usersassociate_with(new_users) 방법이 있습니다. 어쨌든, 그들은 잘 작동합니다. 또한 "associate_with"방법의 끝 부분에이 라인을 가지고 :

def associate_with 
    # mysql INSERT here 
    self.users(true) # Should force reload 
end 

이 테스트 환경 (모두 컨트롤러와 모델 테스트)에서 실행할 때 예상대로 작동과 내가 true 인수를 제거하면 예상대로 실패하는 강제로 다시로드합니다. 또한 script/console에서 개발중인 경우 update_attributes 모델에서 작동합니다. 그러나 컨트롤러에서 update_attributes을 시도 할 때 개발 또는 생산에 실패합니다. 연관을 다시로드하지 않고이 쿼리에 대해 "CACHE (0.0ms)"라고 표시된 로그에서 볼 수 있습니다.

이상한 일 - 전에는 효과가 있었지만 어떤 이유로 인해 작동이 멈춘 순간을 확인할 수 없습니다. 나는 누군가 이것이 이것을 어떻게 가능하게 하는지를 아마 알고 있기를 바랬다.

답변

3

ActiveRecord SQL 쿼리 캐시의 효과가 나타납니다.

어느 블록 내부의 모든 조회 결과를 캐싱 액티브을 중지 uncached

self.class.uncached do 
    # ... 
end 

이에 호에 users 연관 사전 INSERT 참조 랩. 여러 곳에서 코드를 작성하면이 작업이 짜증납니다.

connection.clear_query_cache을 호출하여 삽입을 완료 한 후 캐시를 지울 수도 있습니다.

+0

모델 내부에서 호출 할 때 불행히도 'uncached'라는 정의되지 않은 메서드가 있다고합니다. – snitko

+1

잘 잡습니다. 인스턴스 메소드가 아니라 클래스 메소드입니다. 내 대답에 그 범위를 수정했습니다. –

+0

그러면 Rails에 버그가 있습니까? 재로드를 호출하는 것이 실제로 재로드되어야하는 것처럼 보입니다. SQL 쿼리 캐시는 데이터베이스가 실제로 변경되지 않았다는 것을 알기에 충분히 똑똑 할 수도 있지만 가능합니다. 어떤 경우에, 이것은 정말로 걱정할 사항이 아닙니다. –

0

지금까지 나는 다음과 AR을 속일 수있었습니다 :

def associate_with 
    # mysql INSERT here 
    @users = self.users.find(:all, :conditions => ['users.id IS NOT NULL']) 
end 

def users 
    @users || self.users 
end 
0

내가 할 수 있었던 유일한 방법은 완전히 투명 캐시는 reload를 호출하는 것입니다 수 있습니다. 예를 들어,

User.reload

를 호출 할 수 있으며, 그것은 어떤 관계 또는 협회를 포함하여 명확한 캐시를 강제해야한다.