【问题标题】:What exactly is this rails 3 .build method doing?这个 rails 3 .build 方法到底在做什么?
【发布时间】:2012-07-19 04:10:49
【问题描述】:

从著名的 Agile Web Development with rails 书(最新版)中获取这个 sn-p:

def create 

  @cart = current_cart 

  product = Product.find(params[:product_id])

  @line_item = @cart.line_items.build(product: product)

这适用于一般电子商务/仓库应用,此功能适用于特定产品的“添加到购物车”按钮。这就是我感到困惑的地方:

我想象的代码是:

@line_item = line_items.build(product: product) 

@line_item = line_items.build(cart: @cart) 

基本上,如果line_item 既属于产品又属于购物车,我会分别创建这些关系。

另外,如果购物车还没有line_items,那我该怎么办@cart.line_items?我知道line_items.build(product: product) 将返回给我一个line_item 对象(我将其保存到@line_item),但是如果购物车中还没有line_itemscart.line_items 如何工作?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2


    【解决方案1】:

    Cart 模型中,很可能有一个has_manyLineItem 模型line_items 关联。 Rails 将自动使用空数组初始化该关联。

    你可以认为@cart被初始化为:

    @cart = Cart.new
    @cart.line_items = []
    

    每次添加 call @cart.line_items.build 时,都可以这样想:

    new_line_item = LineItem.new cart: @cart
    @cart.line_items.push new_line_item
    

    注意:这绝对不是实际代码的工作方式,但您可以将功能行为视为相同。

    【讨论】:

      【解决方案2】:

      @cart.line_items 有时可能表现得像一个数组,但它是actually an object,具有更多包含关系信息的功能。因此,当您调用 @cart.line_items.build 时,您实际上是在向(我认为)ActiveRecord::Relation 类型的对象发送消息 build,然后它会在您的 line_item 的内存中构建一个对象,并且已经设置了 cart_id。

      【讨论】:

        猜你喜欢
        • 2012-03-07
        • 2015-01-23
        • 2018-04-19
        • 1970-01-01
        • 2022-01-10
        • 1970-01-01
        • 1970-01-01
        • 2021-03-07
        • 2015-04-23
        相关资源
        最近更新 更多