2012-06-18 56 views
0

我有一个模型说带有计算字段的模型。像下面跨多个实例的相同的活动记录数据集

class modelA < ActiveRecord::Base 
     attr_accessor : calc_field 

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

end 

现在我的问题是,如果我有100个记录modelA。 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 

我希望帮助