Как включить параметры товара в заказ, вкл. количества для соответствующих опций?
-> Мне неясно, как справляться с отношением «многие ко многим» между заказами и опциями продукта и связывать их все вместе в форме заказа. .
Ниже приведен код, показывающий, как мои таблицы связаны в данный момент и как я в настоящее время пытаюсь решить его в форме.
models
class Order < ApplicationRecord
has_many :order_options, dependent: :destroy
end
class OrderOption < ApplicationRecord
belongs_to :option
belongs_to :order
end
class Option < ApplicationRecord
belongs_to :product_type
has_many :order_options, dependent: :destroy
end
class ProductType < ApplicationRecord
has_many :options, dependent: :destroy
end
orders_controller
class OrdersController < ApplicationController
def new
@shop = Shop.find(params[:shop_id])
@order = Order.new
@orders = @shop.orders
@order.order_products.build
@order.order_options.build
@product_type_list = @shop.product_types
@order.build_order_contact
@products = []
@options = []
# Display products/options for type
if params[:product_type].present?
@products = ProductType.find(params[:product_type]).products
@options = ProductType.find(params[:product_type]).options
end
if request.xhr?
respond_to do |format|
format.json {
render json: {products: @products, options: @options}
}
end
end
форма заказа
<%= simple_form_for [@shop, @order] do |f|%>
<%= f.simple_fields_for :order_products do |order_product| %>
#select product for which options are shown -->
<%= order_product.simple_fields_for :products do |product| %>
<%= product.input :product_type_id, collection: @product_type_list,
input_html:{
value: @product_type_list.object_id,
id: "product_type"
}
%>
<% end %>
#area to display options belonging to the product
chosen above incl. dropdown field where users
can select a quantity. -->
<h4>Options:</h4>
<div id="render-options">
# Place where Javascript and Ajax can be rendered with possible options and dropdown field for quantity
</div>
<%= f.button :submit%>
Javascript / Ajax
<script >
// Grab selected product_type on which options are based -->
$(document).on("change", "#product_type", function(){
var product_type = $(this).val();
$.ajax({
url: "/shops/<%= @shop.id %>/orders/new",
method: "GET",
dataType: "json",
data: {product_type: product_type},
error: function (xhr, status, error) {
console.error('AJAX Error: ' + status + error);
},
success: function (response) {
console.log(response);
// dynamic rendered options -->
var options = response["options"];
$("#render-options").html("");
$("#render-options").append("");
for(var i=0; i< options.length; i++){
$("#render-options").append('<option value="' + options[i]["id"] + '">' + options[i]["name"] + '</option>');
console.log(options[i].orders)
}
}
});
});
</script>