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

时间:2015-12-16 03:59:43

标签: ruby-on-rails ruby-on-rails-4

CartItem控制器和CartItem模型处理将项添加到CartItems表。通过调用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

OrderItems Controller

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

OrderItems模型

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

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

1 个答案:

答案 0 :(得分:0)

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

具体而言,将一个模型中的数据复制到另一个模型是非常低效的。使用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来管理交付和付款等。