[英]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.