Activity Description

Create a migration that copies the product price into the line item, and add_product method in the Cart model to capture the price whenever a new line item is created.

Author’s Solutions

blah

Readers’ Solutions blah

Marius says

The migration first: rails generate migration add_product_price_to_line_item price:decimal

class AddProductPriceToLineItem < ActiveRecord::Migration
  def self.up
    add_column :line_items, :price, :decimal, :precision => 8, :scale => 2
  end

  def self.down
    remove_column :line_items, :price
  end
end
In app/models/cart.rb*

def add_product(product_id, product_price)
  current_item = line_items.where(:product_id => product_id).first
  if current_item
    current_item.quantity += 1
  else
    current_item = LineItem.new(:product_id => product_id, :price => product_price)
    line_items << current_item
  end
  current_item
end
In app/controllers/line_items_controller.rb pass product.price as an argument in the Create action:

def create
  @cart = current_cart
  product = Product.find(params[:product_id])
  @line_item = @cart.add_product(product.id, product.price)
  session[:counter] = 0
  respond_to do |format|
    if @line_item.save
      format.html { redirect_to(@line_item.cart) }
      format.xml  { render :xml => @line_item, :status => :created, :location => @line_item }
    else
      format.html { render :action => "new" }
      format.xml  { render :xml => @line_item.errors, :status => :unprocessable_entity }
    end
  end
end

Brent says

The migration should update existing line items price with the product price. The add_product method will only take care of adding new products (after the migration).