0

計算フィールドを持つmodelaというモデルがあります。以下のように

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のすべてのインスタンスで共有されます。したがって、一度だけ呼び出されます。

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 に答える