了解rails活动记录关联

时间:2013-12-29 08:16:43

标签: ruby-on-rails

我正在阅读一本关于敏捷Web开发的书,我找到了这段代码

应用程序控制器

  private    
  def current_cart
    Cart.find(session[:cart_id])
  rescue ActiveRecord::RecordNotFound
    cart = Cart.create
    session[:cart_id] = cart.id
    cart
  end

订单项控制器

def create
  @cart = current_cart
  product = Product.find(params[:product_id])
  @line_item = @cart.line_items.build(:product => product)
  respond_to do |format|
   if @line_item.save
     format.html { redirect_to(@line_item.cart,
            :notice => 'Line item was successfully created.') }

我不明白以下两行

@line_item = @cart.line_items.build(:product => product)
format.html { redirect_to(@line_item.cart,
       :notice => 'Line item was successfully created.') }

@cart保存cart_id的值然后@cart.line_items点{build}在这里有什么用途?

此处@line_item.cart的含义是什么?将调用哪个动作?

2 个答案:

答案 0 :(得分:1)

好的,让我们从@cart开始吧。正如phoet所说,它不是一个简单的整数。它由Cart.find(session[:cart_id])设置,因此它是基于数据库中一行的Cart模型的实例。

Cart模型可能继承自ActiveRecord::Base,它具有模型之间has_many(和其他)关联(关系)的所有逻辑。所以,我希望至少看到

def Cart < ActiveRecord::Base
    has_many :line_items
end

Cart模型中。

因此,当您致电@cart.line_items时,您会通过调用has_many设置的关联从概念上获得该购物车订单项的列表。在build上调用LineItem会导致cart_id模型的@cart.id模型实例{{1}}设置为{{1}}。

我希望稍微澄清一下。 Rails协会是一项棘手的业务。

答案 1 :(得分:0)

您的假设不正确。 @cart拥有Cart方法中的current_cart个对象。它可以是新的,也可以是会议期间的那个。

因此@cart.line_items适用于has_many的{​​{1}}关系,而Cart会设置一个新的line_items.build,以便LineItem保存到数据库中}。