这行代码有什么作用?

时间:2010-12-06 22:01:17

标签: ruby ruby-on-rails-3

我正在阅读使用Rails 4Th editon的敏捷网络开发一书,当他在一个模型中展示这个方法时:

def add_line_items_from_cart(cart)
    cart.line_items.each do |item|
      item.cart_id = nil
      line_items << item
    end
  end

这就是解释:

*对于我们从购物车转移到订单的每件商品,我们需要做两件事。首先我们将cart_id设置为nil,以防止物品在销毁购物车时变脏。然后我们将项目本身添加到订单的line_items集合中。请注意,我们不必对各种外键字段执行任何特殊操作,例如在行项目行中设置order_id列以引用新创建的订单行。 Rails使用我们添加到Order和LineItem模型的has_many和belongs_to声明为我们编织。将每个新订单项附加到line_items集合,将密钥管理责任交给Rails。*

有人可以解释这个简单的代码行line_items&lt;&lt;项目做了所有的事情?

感谢您的关注 西蒙

4 个答案:

答案 0 :(得分:3)

  

有人可以解释一下这段简单的代码line_items << item如何完成所有这些工作吗?

那条线不能完成所有这些。

这样可以更好地阅读:

def add_line_items_from_cart(cart)   #<-- For each item that we transfer from the cart to the order we need to do two things
    cart.line_items.each do |item|
      item.cart_id = nil             #<-- First we set the cart_id to nil in order to prevent the item from going poof when we destroy the cart.
      line_items << item             #<-- Then we add the item itself to the line_items collection for the order
    end
end

剩下的:

请注意,我们没有必要对......等做任何特别的事情

是关于框架的功能的信息。因此,描述对应于整段代码而不仅仅是该行。

答案 1 :(得分:2)

cart.line_items.each do |item| - &gt;从该购物车中获取每个line_items并“为它们命名”项目,以便您可以对它们进行更改

item.cart_id = nil - &gt;将项目的card_id设置为nil

line_items << item - &gt;将项目本身添加到订单的line_items集合

答案 2 :(得分:0)

line_items是一个列表,line_items << item将一个项目添加到该列表中。 item.cart_id = nil使用该项清除购物车ID,以防它与其他购物车相关联。

答案 3 :(得分:0)

这本书已经说过Rails所需的全部东西是Rails的工作,line_items,belongs_to和has_many。在Rails内部,它可以帮助我们更新line_item.order_id。