рельсы вопрос: как создать несколько дочерних объектов, связанных с родительским объектом с помощью выпадающего списка в форме создания родителей? - PullRequest
1 голос
/ 30 марта 2010

В движке бронирования для покупки билетов на мероприятия, написанные в рельсах, у меня есть следующие модели:

заказ

билет

В одном заказе много билетов, а один билет принадлежит событию.

Люди, которые хотят забронировать билеты на мероприятие, обычно создают новый заказ. Они заполняют некоторые детали (сохраняются в модели заказа), и в конце они видят выпадающие списки, в которых можно выбрать количество билетов для каждого типа билетов (например, VIP-билеты, студенческие билеты, ...).

Скриншот можно найти здесь:

http://eerlings.com/orders.png

Я хотел бы реализовать, что при создании заказа в БД для каждого типа заявки в БД создается заявка, связанная с этим заказом. Если участник выбрал «5» в раскрывающемся списке для VIP-билетов и «3» для студенческих билетов, всего в БД должно быть создано 8 билетов.

Каков наилучший способ реализовать это в рельсах? есть предложения?

Ciao, Pieter

Ответы [ 2 ]

1 голос
/ 16 декабря 2010

Возможно, у вас есть отдельные параметры для 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 голосов
/ 16 декабря 2010
...