在更改其中一个属性时复制对象

时间:2014-06-06 23:51:41

标签: ruby ruby-on-rails-3

我有一个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

目前,我有上述内容。是否有更好的方法可以在一行中进行欺骗和更改属性?

1 个答案:

答案 0 :(得分: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

编辑:

制作方法Cart#duplicate,返回您需要的内容

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