我有一个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 :(得分: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