1

コード:

user = ... #pretend it has a value :)
instances = Array.new
Product.all.each do |product|
    productInstance = ProductInstance.new
    productInstance.user = user
    productInstance.product = product
    instances.push(productInstance)
end

ProductProductInstanceどちらも Rails モデルです。for-each ループはProduct.all遅くなりますか? これを行うためのより良い方法があるかどうか疑問に思っています...

4

5 に答える 5

3

一度にコレクション全体を反復しないでください。

たぶん、これはあなたの開発ボックスでうまくいくかもしれませんし、おそらくあなたの新しい製品でもうまくいくでしょう。

しかし、アプリケーションの人気が高まり、DB に膨大な量のレコードが含まれるようになると、コードで時間とメモリの問題が発生します。

たとえばhttp://apidock.com/rails/ActiveRecord/Batches/ClassMethods/find_in_batchesを使用して、ガベージ コレクションのしくみを学習しますhttp://timetobleed.com/garbage-collection-slides-from-la-ruby-conference/

Product.find_in_batches do |products|
  products.each do |product|
    productInstance = ProductInstance.new
    productInstance.user = user
    productInstance.product = product
    instances.push(productInstance)  
  end
end
于 2012-07-26T08:54:17.257 に答える
1

私は(より慣用的です)に変更eachするだけです。map

instances = Product.all.map do |product|
    productInstance = ProductInstance.new
    productInstance.user = user
    productInstance.product = product
    productInstance
end
于 2012-07-26T05:52:12.840 に答える
1

このようなものはうまくいくはずです。

instances = Product.all.map do |product|
    productInstance = ProductInstance.new(:user => user,:product => product)
end

あるいは

instances = Product.all.map do |product|
    ProductInstance.new(:user => user,:product => product)
end

一括割り当ての制限については、次のようなものを試すことができます

instances = Product.all.map do |product|
    ProductInstance.new {|instance| instance.user = user;instance.product = product}
end
于 2012-07-26T05:58:16.520 に答える
1

ProductInstanceモデルの最初に追加

attr_accessible :user, :product 

その後

instances = Product.all.map {|product| ProductInstance.create(:user => user, :product => product)}

動作するはずです。

于 2012-07-26T06:15:32.497 に答える
0

このようにもできます

 instances = Product.all.map {|product| ProductInstance.new(:user => user, :product => product)}
于 2012-07-26T05:59:07.390 に答える