2014-06-06 107 views
0

我有一個要複製的對象CartItem。每個CartItem屬於Cart在更改某個對象的屬性時複製對象

我正在寫一個方法,將採取一箇舊的訂單,並複製其所有cart_items並將其放置在當前的購物車。

order.add_items_to_cart(current_cart, current_user)

Order.rb

def add_items_to_cart(cart, cart_user) 
    cart.update_attributes(merchant_id: self.merchant_id) 

    self.cart_items.each do |ci| 
    new_cart_item = ci.dup 
    new_cart_item.save 
    new_cart_item.update_attributes(cart_id: cart.id, cart_user_id: cart_user.id) 
    end 
end 

目前,我有以上。有沒有更好的方法來改變和改變一行中的屬性?

回答

0

如果只複製屬性,但關聯對你來說可以,那麼你的表現很好。 http://apidock.com/rails/ActiveRecord/Core/dup

但是,我建議你使用assign_attributes,所以你只會做一個查詢。

def add_items_to_cart(cart, cart_user) 
    cart.update_attributes(merchant_id: self.merchant_id) 

    self.cart_items.each do |ci| 
    new_cart_item = ci.dup 
    new_cart_item.assign_attributes(cart_id: cart.id, cart_user_id: cart_user.id) 
    new_cart_item.save 
    end 
end 

編輯:

製作方法車#重複,它返回你所需要的

class CartItem  

    ... 

    # returns copy of an item 
    def duplicate 
    c = Cart.new cart_id: cart.id, cart_user_id: cart_user.id 
    # copy another attributes inside this method 
    c 
    end 
end 


# And use it 
self.cart_items.each do |ci| 
    new_card_item = ci.duplicate 
    new_card_item.save 
end 
+0

我要複製的屬性,也是協會,但我要指出的協會一個不同的對象。 – Huy

+0

你可以創建方法'CartItem#duplicate',它返回你所需要的。我已經更新了上面的代碼。 – Zhomart