Двойная полиморфная форма c один ко многим - PullRequest
0 голосов
/ 14 января 2020

У меня есть ассоциация полиморфизма c, и я пытаюсь создать форму, которая связывает Product с FoodOrder:

class FoodOrder < ActiveRecord::Base
    belongs_to :client
    belongs_to :order_status

    has_many :order_items, dependent: :destroy, as: :order
    has_many :orderables, through: :order_items, source: :orderable, source_type: "Product"
end

class OrderItem < ApplicationRecord
  belongs_to :order, polymorphic: true
  belongs_to :orderable, polymorphic: true

  belongs_to :product, -> { where( order_items: { orderable_type: 'Product' } ).includes(:order_items) }, foreign_key: 'orderable_id', optional: true
end

class Product < ApplicationRecord
end

Вот схема для OrderItem:

class OrderItem < ApplicationRecord {
                :id => :integer,
          :quantity => :integer,
        :created_at => :datetime,
        :updated_at => :datetime,
      :orderable_id => :integer,
    :orderable_type => :string,
          :order_id => :integer,
        :order_type => :string
}

Моя форма по сути является меню, и я хотел бы передать все orderables и создать их связь с food_order за один вызов.

<%= simple_form_for [@client, @food_order], defaults: { input_html: { class: "form-input-order" }} do |f| %>
  <%= f.error_notification %>

  <%= f.fields_for :orderables do |order_items_form| %>
        <% Product.all.each do |prod| %>
            <li>
                <%= prod.name %>
                <%= prod.id %>
                <%= order_items_form.input :orderable_id, as: :hidden, input_html: { value: prod.id } %>
                <%= order_items_form.input :orderable_type, as: :hidden, input_html: { value: 'Product' } %>
                quantity: <%= order_items_form.number_field :quantity %>
            </li>
        <% end -%>
    <% end -%>

    <div class="form-actions text-center col-xs-12">
        <%= f.button :submit, "Submit Order !", class: "btn-success" %>
    </div>
<% end %>

Это не работает и в своих параметрах я вижу следующее: (стоит отметить, что последний продукт в форме имеет идентификатор: 48)

Parameters: {"utf8"=>"✓", 
  "food_order"=>{
    "orderables"=>{"orderable_id"=>"48", "orderable_type"=>"Product", "quantity"=>""}
  }, 
  "commit"=>"Submit Order !", 
  "client_id"=>"24324233", 
  "id"=>"2583447"
}

Кажется, что каждый orderable перезаписывает предыдущий orderable, а не передает все упорядоченные параметры как массив.

Как я могу связать много продуктов с этим заказом еды за 1 проход?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...