0

我有一个带有计算字段的模型说 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的所有实例之间共享。所以它只被调用一次。

4

3 回答 3

1

您可以使用类变量。

def calc_field
   @@stuff ||=  modelb.all
   //do fancy things with stuff
end
于 2012-06-18T08:24:59.047 回答
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
于 2012-06-18T08:26:21.377 回答
0

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

modelas = ModelA.includes(:modelbs)

从那时起,当您调用时,数据库将不再被击中(例如)

modelas.first.calc_field

我希望这会有所帮助

于 2012-06-18T08:30:24.193 回答