如何处理用户的多个订单

时间:2016-02-19 10:44:08

标签: ruby-on-rails-4

在我看来,有一个像这样的查询..

<%= CaricatureType.find_by(id: StudioOrder.find_by(user_id: spree_current_user.id).style_id).name %>

studio_orders和caricature_types的架构如下

create_table "studio_orders", force: :cascade do |t|
    t.integer  "user_id"
    t.integer  "occasion_id"
    t.integer  "style_id"
    t.integer  "number_of_people"
    t.string   "artwork_size"
    t.integer  "package_id"
    t.text     "instructions"
    t.datetime "created_at",         null: false
    t.datetime "updated_at",         null: false
    t.float    "initial_price"
    t.float    "final_price"
    t.string   "image_file_name"
    t.string   "image_content_type"
    t.integer  "image_file_size"
    t.datetime "image_updated_at"
    t.json     "avatars"
    t.integer  "address_id"
  end


create_table "caricature_types", force: :cascade do |t|
    t.string   "name"
    t.text     "description"
    t.float    "price"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
  end

现在问题是,我上面发布的视图中的查询来自order_summary屏幕,查询只输出他选择的样式的名称。 现在的问题是,从技术上讲,studio_orders中可能有很多行具有相同的用户ID。 But how to display the current style the user has choosen in the order_summary screen.

1 个答案:

答案 0 :(得分:0)

在您的视图中添加任何 ActiveRecord声明是不好的做法。所有这些都应由控制器处理:

#app/controllers/your_controller.rb
class YourController < ApplicationController
  def show
    @types = CaricatureType.find_by(id: StudioOrder.find_by(user_id: spree_current_user.id).style_id).name %> 
  end
end

这有两个好处:

  1. 您的所有逻辑都保存在一个地方
  2. 如果数据在ActiveRecord 中被多次调用,
  3. @instance_variable将重复使用这些数据

    针对您的具体问题,

      

    但是如何显示用户在order_summary屏幕中选择的当前样式

    这是供你决定的。

    理想情况下,您希望在current表格中添加studio_orders列。将类型boolean分配给此列将允许您使用以下内容:

    @current_type = CaricatureType.find_by id: spree_current_user.studio_orders.style_id, current: true
    

    Rails可能会重视convention over configuration - 但您可以根据需要自由构建架构/模型。这包括在您需要时设置current列。