2012-06-18 4 views
0

나는 calculate 필드가있는 model saya 모델을 가지고 있습니다. 아래처럼많은 인스턴스에서 동일한 활성 레코드 데이터 집합

class modelA < ActiveRecord::Base 
     attr_accessor : calc_field 

def calc_field 
    @stuff = modelb.all 
    //do fancy things with stuff 
end 

end 

내 문제는 내가 modelA의 100 개의 기록이 있다면입니다. modelb.all은 100 회 호출됩니다. 매번 같은 데이터 세트를 사용합니다. 하지만 쿼리는 100 번 보내집니다.

어쨌든/어디서나 @stuff를 전역 적으로 선언 할 수 있으므로 modelA의 모든 인스턴스에서 공유됩니다. 그래서 그것은 한 번만 호출됩니다.

답변

1

이 문제를 해결하는 방법에는 여러 가지가 있습니다.

솔루션 A :

class modelA < ActiveRecord::Base 
    attr_accessor : calc_field 

    def calc_field(modelb_info) 
    @stuff = modelb_info 
    //do fancy things with stuff 
    end 

end 

그리고 코드 작업에 흐름

model_info = ModelB.all 
model_a_array.collect{|model_a| model_a model_info} 

솔루션 B

class modelA < ActiveRecord::Base 
    @@stuff ||= ModelB.all 
end 
1

클래스 변수를 사용할 수 있습니다.

def calc_field 
    @@stuff ||= modelb.all 
    //do fancy things with stuff 
end 
0

당신이 MODELA 인스턴스를 얻을 수있는 방법을 수정할 수 있다면, 다음과 같이 제안합니다.

modelas = ModelA.includes(:modelbs) 
그때부터

는 데이터베이스가 전화 할 때 더 이상 공격하지 않습니다 (예를 들어) 나는 희망

modelas.first.calc_field 

는 그

을하는 데 도움이