跨多个实例的相同活动记录数据集

时间:2012-06-18 08:21:39

标签: ruby-on-rails ruby-on-rails-3 activerecord

我有一个名为modela的模型,带有一个计算字段。如下所示

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实例中共享它。所以它只被调用一次。

3 个答案:

答案 0 :(得分:1)

您可以使用类变量。

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

答案 1 :(得分: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

答案 2 :(得分:0)

如果您可以修改获取ModelA实例的方式,我建议:

modelas = ModelA.includes(:modelbs)

从那时起,当您致电(例如)

时,数据库将不再被点击
modelas.first.calc_field

我希望有帮助