【问题标题】:Rails - storing values - through associationRails - 存储值 - 通过关联
【发布时间】:2014-06-06 03:17:22
【问题描述】:

我想使用订单表格将下表中的值存储在:quantity 中,但我不知道如何为这个特定的表执行此操作。

 create_table "order_items", force: true do |t|
    t.integer  "item_id"
    t.integer  "order_id"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.integer  "quantity"
    t.decimal  "price"
  end

关系如下

订购型号

has_many :order_items
has_many :items, :through => :order_items

项目模型

has_many :order_items
has_many :orders, :through => :order_items

OrderItem 模型

belongs_to :item
belongs_to :order

【问题讨论】:

  • 你看过嵌套表单吗?
  • 与您的问题无关,但觉得我应该指出您的逻辑中的一个巨大(和常见)缺陷。 items 应该纯粹用作查找,而不是与订单直接相关。您应该将所选项目数据“复制”到 order_item 记录,而不是将项目关联到 order_item。这允许您更新项目数据,并且可以选择而不是强制将更新应用于历史完成的订单。
  • @jamesw 你这是什么意思?我可以看到这是如何工作的,并且不会影响项目,除了参考?
  • 如果项目记录上的任何细节发生变化,该变化将反映在以前购买的所有项目上,这是错误的。如果您查看 2 年前购买的订单商品,您需要查看当时该商品的描述和措辞,而不是现在的说明。因此,在购买时将查找数据“复制”到 order_item 是一种很好的做法,并且确实是某些组织的要求,而且还提供了审计跟踪。
  • @jamesw,很好的见解,我会进行修改

标签: ruby-on-rails ruby-on-rails-4 associations simple-form


【解决方案1】:

您需要使用 accepts_nested_attributes_for,然后在 Rails 中使用 nested form

#app/models/order.rb
Class Order < ActiveRecord::Base
   has_many :order_items
   has_many :items, :through => :order_items

   accepts_nested_attributes_for :order_items
end

这意味着您必须在发送数据之前build order_item 对象,以便您的表单可以使用f.fields_for 方法来处理关联数据,如下所示:

#app/controllers/orders_controller.rb
Class OrdersController < ApplicationController
   def new
      @order = Order.new
      @order.order_items.build
   end

   def create
      @order = Order.new(order_params)
      @order.save
   end

   private

   def order_params
      params.require(:order).permit(:order, :params, order_items_attributes: [:quantity])
   end

end

#app/views/orders/new.html.erb
<%= form_for @order do |f| %>
   <%= f.fields_for :order_items do |o| %>
       <%= o.text_field :quantity %>
   <% end %>
<% end %>

【讨论】:

  • 我刚刚注意到项目 id 没有在 item_orders 表中注册。我为此 here 创建了一个问题
  • 我搞定了。其他一些问题:我还没有实现affect the total price的数量。我还没有实现添加多个item line 的方法。
猜你喜欢
  • 2016-08-24
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 2013-04-13
相关资源
最近更新 更多