2012-07-26 170 views
1

代碼:這個Ruby on Rails代碼可以被優化或改進嗎?

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是兩條軌道模型。 Product.all上的for-each循環會變慢嗎?只是想知道是否有更好的方式來做到這一點...

+0

的'product'變量的塊內的產品的情況下,讓你做另一個模型只是存儲產品和用戶對象實例?不要將具有所有屬性的整個模型拖到productInstance中,只將product_id和user_id放入它中會更快? – 2012-07-26 06:11:53

+0

哪個數據庫? – 2012-07-26 14:34:07

回答

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 
+0

如果'ProductInstance.user'和'ProductInstance.product'不是可以批量賦值的(即不能被傳入'ProductInstance.new()'),有沒有辦法做到這一點? – 2012-07-26 06:05:36

+0

@ Dr.SteveBrule請檢查最新的答案,希望能幫助 – PriteshJ 2012-07-26 07:45:53

1

我只會將each更改爲map(它更習慣用法)。

instances = Product.all.map do |product| 
    productInstance = ProductInstance.new 
    productInstance.user = user 
    productInstance.product = product 
    productInstance 
end 
0

它可以像這也

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

先完成你的ProductInstance模型添加

attr_accessible :user, :product 

然後

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

應該工作。

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 
+0

這是迄今爲止最有價值的答案。值得一提的是有'#find_each'方法可以擺脫代碼的嵌套。 – keymone 2012-07-26 14:34:06