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

Product并且ProductInstance都是 Rails 模型。for-each 循环Product.all会变慢吗?只是想知道是否有更好的方法来做到这一点......

4

5 回答 5

3

永远不要一次迭代整个集合。

也许这在您的开发箱上可以正常工作,也许在您的新产品上也可以。

但是当您的应用程序变得流行并且您的数据库将有大量记录时,您的代码就会出现时间和内存问题。

使用例如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

我只会更改eachmap(它更惯用)。

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 回答