簡體   English   中英

帶乘模型的購物車

[英]Shopping cart with multiply models

我們建立了(基於Agile webdev Rails4本書)購物/詢問車。

訪客可以將line_items(房屋)添加到購物車,然后結帳。 訪客簽出線索后,即創建線索。

我的模特:

class House < ActiveRecord::Base
has_many :line_items
end

class LineItem < ActiveRecord::Base
  belongs_to :lead


  belongs_to :house

  belongs_to :cart

end



 class Lead < ActiveRecord::Base
    has_many :line_items, dependent: :destroy



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

end

class Cart < ActiveRecord::Base
  has_many :line_items, dependent: :destroy
  accepts_nested_attributes_for :line_items


end

用於創建會話購物車的模塊

module CurrentCart
  extend ActiveSupport::Concern

  private

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

Carts_controller

class CartsController < ApplicationController
  before_action :set_cart, only: [:show, :edit, :update, :destroy]

    def create
        @cart = Cart.new(cart_params)

        respond_to do |format|
          if @cart.save
            format.html { redirect_to @cart, notice: 'Cart was successfully created.' }
            format.json { render action: 'show', status: :created, location: @cart }
          else
            format.html { render action: 'new' }
            format.json { render json: @cart.errors, status: :unprocessable_entity }
          end
        end
      end
    end

Line_item控制器

class LineItemsController < ApplicationController
  skip_before_action :authorize, only: :create
  include CurrentCart
  before_action :set_cart, only: [:create]
  before_action :set_line_item, only: [:show, :edit, :update, :destroy]

def create

    house = House.find(params[:house_id])
    @line_item = @cart.line_items.build(house_id: house.id)

    respond_to do |format|
      if @line_item.save
        format.html { redirect_to @line_item.cart,
          notice: 'Vakantiehuis toegevoegd in lijst.' }
        format.json { render action: 'show',
          status: :created, location: @line_item }
      else
        format.html { render action: 'new' }
        format.json { render json: @line_item.errors,
          status: :unprocessable_entity }
      end
    end
  end

leads_controller

class LeadsController < ApplicationController
  include CurrentCart
  before_action :set_cart, only: [:new, :create]

 def create
    @lead = Lead.new(lead_params)
    @lead.add_line_items_from_cart(@cart)

    respond_to do |format|
      if @lead.save

        format.html { redirect_to @lead, notice: 
          'Thank you for your order.' }
        format.json { render action: 'show', status: :created,
          location: @order }

      else
        format.html { render action: 'new' }
        format.json { render json: @lead.errors,
          status: :unprocessable_entity }
      end

    end

  end
end

我們要添加一個新模型(購物車中的公寓)。 所以我在line_items表中添加了apartment_id並更改了模型

class Apartment < ActiveRecord::Base
    has_many :line_items
    end


class LineItem < ActiveRecord::Base
      belongs_to :lead


      belongs_to :house
      belongs_to :apartment


      belongs_to :cart

    end

但是我現在不怎么必須更改LineItems_controller中的create方法,以便我們可以將房屋和公寓添加到購物車中?

謝謝雷姆科

您將需要更改line_items模型以具有多態關聯

在此處輸入圖片說明

多態關聯只是當您能夠關聯同一模型中的不同對象時。 如果您的apartmentsHouse模型的子對象,這將是不正確的,但是由於它們是獨立的,因此您可以將它們多態關聯

這是我的處理方式:

#app/models/line_item.rb
class LineItem < ActiveRecord::Base
   belongs_to :item, polymorphic: true
end

#app/models/house.rb
class House < ActiveRecord::Base
   has_many :line_items, as: :items
end

#app/models/apartment.rb
class Apartment < ActiveRecord::Base
   has_many :line_items, as: :items
end

這將使您能夠執行以下操作:

#app/controllers/line_items.controller.rb
class LineItemsController < ApplicationController
   before_action :create_object

   def create
      @line_item = @cart.line_items.build item: @object
      @line_items.save
   end

   private

   def create_object
      id = params[:house_id] || params[:apartment_id]

      model = "House" if params[:house_id]
      model = "Apartment" if params[:apartment_id]
      model. constantize

      @object = model.find id
   end
end

這應該為您引用正確的模型,以便您可以將公寓或房屋保存為LineItem模型

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM