使用控制器操作从一个模型中检索数据,并将数据保存到另一个模型Rails 4中



CartItem控制器和CartItem模型处理向CartItems表添加项。Cart视图是通过调用CartItem模型和控制器来呈现的。单击"结账"时,我想将CartItem表中为给定卡保存的所有项目转移到OrderItem表中。

在购物车视图页面上单击"结账"时,应发生以下情况:来自Cart view 的呼叫订单控制器

<%= button_to "Checkout", controller: 'orders', action: 'create' %>

订单管理员

def create
  @order = Order.new
  if logged_in?
    @order[:user_id] = current_user.id     #This works
  end  
  #Need help: call Order_Items_Controller create action
  if @order.save
    flash[:success] = "Order created"
  else  
    flash[:danger] = "Failed"
  end
  redirect_to checkout_address_path
end

订单项控制器

def create
  #retrieve all records from Cart_Items where cart_id matches cookies[:cart_id]
  @order_item = @order.order_items.build!(CartItem.where(:cart_id => cookies[:cart_id]))
  #Need help: add order_id for current order to each record 
  #Need help: save the cart_items to the order_items table and handle exceptions  
end

订单模型

class Order < ActiveRecord::Base
  has_many :order_items
end

订单项目模型

class OrderItem < ActiveRecord::Base
  belongs_to :order
  validates :order_id, presence: true
end

我为什么要这么做?订单成功处理后,相应的CartItems数据将被删除,因此卡片为空。OrderItems存储已完成订单的数据,以便购物者可以在线查看订单历史记录。

您考虑过模型/数据结构的设置吗?

具体来说,将一个模型中的数据复制到另一个模型是非常低效的。使用foreign_keyOrder模型链接到购物车会更好:

#app/models/cart.rb
class Cart < ActiveRecord::Base
   #stores cart items for processing
   belongs_to :order
   has_many   :cart_items
end 
#app/models/order.rb
class Order < ActiveRecord::Base
   #stores final values (IE delivery service id, cart id, payment id etc)
   belongs_to :user
   belongs_to :delivery
   belongs_to :payment
   has_one    :cart
end

这样,您就可以调用以下命令:

#app/controllers/carts_controller.rb
class CartsController < ApplicationController
   def checkout
      @cart  = current_user.cart #-> or however you call it
      @order = @cart.order.new order_params
      if @order.save
         #-> remove cart from session etc etc
      end
   end
   private
   def order_params
      params.require(:order).permit(:delivery_id, :user_id, :payment_id)
   end
end

显然是非常高级的,但非常描述性的——Order变成了一个美化的联接模型,允许您编译一个具有相对数量&项目,同时使用Order管理交付和付款等。

最新更新