[英]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
模型以具有多態關聯 :
多態關聯只是當您能夠關聯同一模型中的不同對象時。 如果您的apartments
是House
模型的子對象,這將是不正確的,但是由於它們是獨立的,因此您可以將它們多態關聯
這是我的處理方式:
#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.