2011-08-31 2 views
1

내가이 간단한 응용 프로그램의 작동이 있다고 가정 내 첫 번째보기 내예압 협회

# model 
class Project 
    has_many :numbers 

    def my_numbers 
    numbers 
    end 
end 

# controller 
class ProjectController 
    def index 
    @projects = Project.includes(:numbers) 
    end 
end 

, 아무 문제입니다. 연결을 직접 호출하기 때문에 모든 숫자가 이미로드되었습니다.

@projects.each do |project| 
    project.numbers 
    # no probleme here. Hit the cache of included numbers. 
end 

그리고 여기에 로그

Project Load (0.8ms) SELECT "projects".* FROM "projects" 
ProjectNumber Load (0.5ms) SELECT "project_numbers".* FROM "project_numbers" WHERE "project_numbers"."project_id" IN (1,2) 

그러나 아래 볼 수 있듯이이 두 번째 예제, 프로젝트에서 메서드 호출 내에서 번호를 호출 my_numbers 호출 할 때마다, 새로운 DB 호출을 트리거입니다 :

@projects.each do |project| 
    project.my_numbers 
end 

그리고 여기에 로그

Project Load (0.8ms) SELECT "projects".* FROM "projects" 
ProjectNumber Load (0.5ms) SELECT "project_numbers".* FROM "project_numbers" WHERE "project_numbers"."project_id" IN (1,2) 
ProjectNumber Load (0.5ms) SELECT "project_numbers".* FROM "project_numbers" WHERE "project_numbers"."project_id" = 1 
ProjectNumber Load (0.5ms) SELECT "project_numbers".* FROM "project_numbers" WHERE "project_numbers"."project_id" = 2 
입니다

어쨌든이를 방지 할 수 있습니까? 내 모델이 첫 번째 db 요청의 포함 된 숫자를 재사용하지 않는 이유는 무엇입니까?

미리 감사드립니다.

답변

1

이 코드를 Rails 3.0.9에서 시도했지만 설명하는 동작을 수행하지 않습니다. 번호가 콜백을 트리거하지 않는 것이 확실합니까?

+1

* 머리를 부딪 치다 * 범위 문제 ... – christianblais