2010-03-30 8 views
1

Dans un moteur de réservation pour l'achat de billets pour des événements, écrits dans des rails, je les modèles suivants:question rails: comment créer plusieurs objets enfants liés à un objet parent avec une sélection déroulante dans le formulaire de création de parents?

une commande

un billet

Une commande a de nombreux billets, et un billet appartient à un un événement.

Les personnes qui souhaitent réserver des billets pour un événement créent généralement une nouvelle commande. Ils renseignent quelques détails (conservés dans le modèle de la commande), et à la fin ils voient quelques listes déroulantes où ils peuvent sélectionner le nombre de tickets pour chaque type de ticket (par exemple: tickets VIP, tickets étudiants, ...).

une capture d'écran peut être trouvé ici:

http://eerlings.com/orders.png

Je voudrais mettre en œuvre que lorsque l'ordre est créé dans le DB, pour chaque type de billet, il y a un ticket créé dans le DB, lié à cet ordre. Si le participant a sélectionné "5" dans la liste déroulante pour les tickets VIP, et "3" pour les tickets étudiants, il devrait y avoir 8 tickets créés dans le DB au total.

Quelle serait la meilleure façon d'implémenter cela dans les rails? Aucune suggestion?

Ciao, Pieter

Répondre

1

Vous auriez probablement params séparés pour des billets VIP et des billets d'étudiants, quelque chose comme

params = { 
      :num_vip_tickets => 5, 
      :vip_ticket => { 
          :event_id => 1, 
          :price => 250 
         }, 
      :num_student_tickets => 3, 
      :student_ticket => { 
           :event_id => 1, 
           :price => 10 
          } 
     } 

Je manipulerais que le controlle. Par exemple, en utilisant des noms supposés:

if params[:num_vip_tickets] 
    params[:num_vip_tickets].to_i.times {@order.tickets.create params[:vip_ticket]} 
end 

Une autre façon serait

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

grâce, à la fin, je manipulaient dans le contrôleur, comme vous le suggérez. –