Ruby on rails rails问题:如何在parents create窗体中使用select下拉菜单创建链接到父对象的多个子对象?
在用rails编写的用于购买活动门票的预订引擎中,我有以下模型: 命令 票 一个订单有很多票,一张票属于一个事件 想要预订活动门票的人通常会创建新订单。他们填写一些详细信息(保存在订单模型中),最后他们看到一些下拉列表,可以从中选择每种票类型的票数(例如:VIP票、学生票等) 可在此处找到屏幕截图: 我想实现的是,当在DB中创建订单时,对于每种票证类型,都会在DB中创建一个与此订单链接的票证。如果与会者在下拉列表中为VIP票选择“5”,为学生票选择“3”,则DB中总共应创建8张票 在rails中实现这一点的最佳方法是什么?有什么建议吗 再见, 彼得参见这个问题: 请看这个问题:Ruby on rails rails问题:如何在parents create窗体中使用select下拉菜单创建链接到父对象的多个子对象?,ruby-on-rails,forms,model,nested,Ruby On Rails,Forms,Model,Nested,在用rails编写的用于购买活动门票的预订引擎中,我有以下模型: 命令 票 一个订单有很多票,一张票属于一个事件 想要预订活动门票的人通常会创建新订单。他们填写一些详细信息(保存在订单模型中),最后他们看到一些下拉列表,可以从中选择每种票类型的票数(例如:VIP票、学生票等) 可在此处找到屏幕截图: 我想实现的是,当在DB中创建订单时,对于每种票证类型,都会在DB中创建一个与此订单链接的票证。如果与会者在下拉列表中为VIP票选择“5”,为学生票选择“3”,则DB中总共应创建8张票 在rails
VIP票和学生票可能会有单独的参数,比如
params = {
:num_vip_tickets => 5,
:vip_ticket => {
:event_id => 1,
:price => 250
},
:num_student_tickets => 3,
:student_ticket => {
:event_id => 1,
:price => 10
}
}
我会在控制器里处理。例如,使用一些假名:
if params[:num_vip_tickets]
params[:num_vip_tickets].to_i.times {@order.tickets.create params[:vip_ticket]}
end
另一种方法是
class Order < ActiveRecord::Base
has_many :tickets
accepts_nested_attributes_for :tickets
end
class OrdersController < ApplicationController
def create
params[:order][:ticket_attributes] = []
num_student_tickets = params[:num_student_tickets].to_i
if num_student_tickets > 0
params[:order][:tickets_attributes] += [params[:student_ticket]] * num_student_tickets
end
num_vip_tickets = params[:num_vip_tickets].to_i
if num_vip_tickets > 0
params[:order][:tickets_attributes] += [params[:vip_ticket]] * num_vip_tickets
end
@order = Order.new params[:order]
# ... etc ...
end
end
类顺序0
参数[:顺序][:票证属性]+=[参数[:学生票证]]*num\u学生票证
结束
num\u vip\u tickets=params[:num\u vip\u tickets]。to\u i
如果vip门票数量>0
参数[:顺序][:票证属性]+=[参数[:vip票证]]*num\u vip票证
结束
@订单=订单。新参数[:订单]
# ... 等
结束
结束
VIP票和学生票可能有单独的参数,比如
params = {
:num_vip_tickets => 5,
:vip_ticket => {
:event_id => 1,
:price => 250
},
:num_student_tickets => 3,
:student_ticket => {
:event_id => 1,
:price => 10
}
}
我会在控制器里处理。例如,使用一些假名:
if params[:num_vip_tickets]
params[:num_vip_tickets].to_i.times {@order.tickets.create params[:vip_ticket]}
end
另一种方法是
class Order < ActiveRecord::Base
has_many :tickets
accepts_nested_attributes_for :tickets
end
class OrdersController < ApplicationController
def create
params[:order][:ticket_attributes] = []
num_student_tickets = params[:num_student_tickets].to_i
if num_student_tickets > 0
params[:order][:tickets_attributes] += [params[:student_ticket]] * num_student_tickets
end
num_vip_tickets = params[:num_vip_tickets].to_i
if num_vip_tickets > 0
params[:order][:tickets_attributes] += [params[:vip_ticket]] * num_vip_tickets
end
@order = Order.new params[:order]
# ... etc ...
end
end
类顺序0
参数[:顺序][:票证属性]+=[参数[:学生票证]]*num\u学生票证
结束
num\u vip\u tickets=params[:num\u vip\u tickets]。to\u i
如果vip门票数量>0
参数[:顺序][:票证属性]+=[参数[:vip票证]]*num\u vip票证
结束
@订单=订单。新参数[:订单]
# ... 等
结束
结束
谢谢,最后我按照你的建议在控制器中处理了它。谢谢,最后我按照你的建议在控制器中处理了它。