Я относительно новичок в Rails и создаю свое первое приложение, которое является инструментом цитирования.Ruby on Rails - запись базы данных на основе выпадающего списка
У меня есть 3 стола, с которыми я работаю в настоящее время - Продукты, Заказы и Заказы. Продукты содержат текущую цену нашей продукции, включая затраты. Заказы держат оболочку заказа, которая в конечном итоге привяжет ее к таблице клиентов. В Order_lines хранятся все строки order_lines - и представление заполняется на основе отношения и индекса соответствия между Order_lines и Orders.
В настоящее время представление также включает цены, используя соединение между Продуктами и Order_Lines. Тем не менее, это не позволит мне хранить исторические данные (если я изменю цены в таблице продуктов, а затем все упорядоченные строки, ранее созданные с новыми ценами) - так что я хотел бы, чтобы человек выбирал продукт из выпадающее меню - и для того, чтобы система вытащила текущую цену/стоимость для этого продукта и добавила его в строку заказа.
стол Продукт содержит 4 колонки labed: prod_nrc_cost, prod_nrc_price, prod_mrc_cost, prod_mrc_price
Order_lines стол теперь nrc_cost_line, nrc_price_line, mrc_cost_line, mrc_price_line.
Когда они выбирают продукт 555 - я хочу, чтобы он искал цену для продукта 555 в таблице продуктов - и заполнил эти 4 цены в соответствующих столбцах в таблице Order_lines и сохранил их. Было бы неплохо, если бы я смог заполнить его прямо на странице (давая человеку возможность корректировать цены, если они захотят), а затем отправить его на контроллер для сохранения.
Имеет ли это смысл?
Если я ничего не выкину, сообщите мне.
/orders/show.html.erb файл
<%= form_for(@order_line) do |f| %>
<% if false %>
<% if @order_line.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@order_line.errors.count, "error") %> prohibited this order_line from being saved:</h2>
<ul>
<% @order_line.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<% end %>
<%= f.hidden_field :order_id, class: 'form-control' %>
<%= f.hidden_field :order_num, :value=>@order.order_num, class: 'form-control' %>
<%= f.hidden_field :visible, class: 'form-control', :value=>true, :checked=>true %>
<% if @order_lines.present? %>
<%= f.hidden_field :line_num, :value=>@order_lines.maximum("line_num")+1, class: 'form-control' %>
<% else %>
<%= f.hidden_field :line_num, :value=>1, class: 'form-control' %>
<% end %>
<div class="row">
<div class="field col-md-2 form-group">
<%= f.label :Product %><br>
<%= f.collection_select(:product_id, Product.all, :id, :prod_name, {:prompt => 'Select Product'}, {:id => 'product_id'}) %>
</div>
<div class="field col-md-2 form-group">
<%= f.label :quantity %><br>
<%= f.number_field :quantity, class: 'form-control' %>
</div>
<div class="field col-md-2 form-group">
<%= f.label :NRC %><br>
<%= f.number_field :nrc_price_line, class: 'form-control' %>
</div>
<div class="field col-md-2 form-group">
<%= f.label :MRC %><br>
<%= f.number_field :mrc_price_line, class: 'form-control' %>
</div>
<div class="field col-md-2 form-group">
<%= f.label :discount %><br>
<%= f.number_field :discount, class: 'form-control' %>
</div>
<div class="field col-md-2 form-group">
<%= f.label :notes %><br>
<%= f.text_field :notes, class: 'form-control' %>
</div>
<div class="actions col-md-2" style="padding-top:25px;">
<%= f.submit "Add New Line", class: 'btn btn-primary' %>
</div>
</div>
</div>
<% end %>
orders_controller.rb файл
class OrdersController < ApplicationController
before_action :set_order, only: [:show, :edit, :update, :destroy]
def orders
@order = Order.find(params[:id])
@order_lines = @orders.order_lines
end
# GET /orders
# GET /orders.json
def index
@orders = Order.all
end
# GET /orders/1
# GET /orders/1.json
def show
@order = Order.find(params[:id])
@order_lines = @order.order_lines
@order_line = OrderLine.new(:order_id=>params[:id])
@product_categories = @order_lines.product
end
def update_price
@product = Product.find(params[:product_id])
respond_to do |format|
format.js
end
end
# GET /orders/new
def new
@order = Order.new
end
# GET /orders/1/edit
def edit
end
# POST /orders
# POST /orders.json
def create
@order = Order.new(order_params)
respond_to do |format|
if @order.save
format.html { redirect_to @order, notice: 'Order was successfully created.' }
format.json { render action: 'show', status: :created, location: @order }
else
format.html { render action: 'new' }
format.json { render json: @order.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /orders/1
# PATCH/PUT /orders/1.json
def update
respond_to do |format|
if @order.update(order_params)
format.html { redirect_to @order, notice: 'Order was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @order.errors, status: :unprocessable_entity }
end
end
end
# DELETE /orders/1
# DELETE /orders/1.json
def destroy
@order.destroy
respond_to do |format|
format.html { redirect_to orders_url }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_order
@order = Order.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def order_params
params.require(:order).permit(:emp_id, :cust_id, :order_num)
end
end
order.rb Модель
class Order < ActiveRecord::Base
has_many :order_lines
has_many :product_categories, through: :order_lines
has_many :products, through: :order_lines
end
лол - этот ответ заставил меня понять, как мало я знаю о Rails - хорошо - позвольте мне попытаться имитировать то, что у вас есть здесь- и посмотреть, что я могу придумать. Спасибо, что предоставили направление, я дам вам знать! –
Нет проблем. Это должно сделать вам большую часть пути, но вам нужно будет проявить творческий подход с помощью update_price.js. Возможно, я смогу помочь вам, если вы опубликуете представление, где отображаются продукты. –
вся работа выполняется над представлением /orders/show.html.erb. Я действительно добавил это в исходное сообщение - старайтесь не слишком усмехаться, я уверен, что я испортил некоторые лучшие практики. –