0

Je suis nouveau à Rails vient d'apprendre le mois dernier. J'ai une question concernant la mise en place d'associations de modèles. J'ai en quelque sorte atteint un point où je pense que je dois revenir en arrière et apporter des changements à ce que j'ai déjà fait. Voici le scénario.Rails Association options

Je crée une application pour les groupes pour lister les événements à venir.

Il y a quelques facteurs importants

  • Il y a plusieurs bandes liste d'événements
  • Chaque groupe aura des événements uniques mais aussi partager quelques événements avec quelques-unes des autres groupes (lorsque deux bandes utilisant cette les systèmes jouent ensemble au même endroit)
  • Il existe certaines informations sur chaque événement qui seront communes à toutes les bandes de l'événement (lieu, date, heure, ville, état, etc.)
  • Il y a certaines informations à propos de chaque événement qui est spec ific à une bande (c.-à-d. spécifiques URL d'achat de billets VIP, leur propre description de l'événement, etc.)

Actuellement voici comment sa mise en place:

class Event < ActiveRecord::Base  
    belongs_to :venue 
    scope :upcoming, where('date >= ?', Date.today) 
end 

class Venue < ActiveRecord::Base 
    has_many :events 
    accepts_nested_attributes_for :events 
end 

Je n'ai pas vraiment fait beaucoup avec le modèle artiste encore que je se concentrait juste sur les événements dans le système et répertorié correctement pour 1 artiste qui a été codé en dur.

Essentiellement en ce moment comment cela fonctionne est l'utilisateur va à créer un formulaire d'événement, ils choisissent la date et la prochaine ligne est le nom du lieu. Le formulaire de nom de lieu se complète automatiquement avec le nom du lieu et la ville dans la base de données. Si l'utilisateur crée un événement sur un site déjà présent dans le système, il enregistre essentiellement les informations sur l'événement via le modèle Venue en tant qu'attribut imbriqué. Si le lieu ne figure pas dans le système, des champs de saisie supplémentaires apparaissent pour les données de localisation, puis un nouveau lieu est créé et associé à cet événement.

Cela commence à être un peu difficile quand je commence à réfléchir à la meilleure façon de faire partager des événements aux artistes et de maintenir des détails particuliers sur les événements qui sont spécifiques à cet artiste seulement. Je pourrais juste traiter chaque événement comme un événement individuel et ce serait facile mais je ne suis pas sûr de savoir comment je pourrais dire que cet artiste joue avec ces artistes à cette date en dehors des artistes qui entrent ces noms directement dans 1 domaine. Je perds aussi beaucoup de la magie de l'ActiveRecords par rapport à quels artistes ont joué avec quels autres artistes où, etc.

A partir de maintenant, il n'y a qu'un seul modèle pour les événements, mais je pense que c'est peut-être mieux conserver 1 modèle central pour les bases de l'événement qui ne sont pas partagées par plusieurs groupes comme le lieu, la ville, l'état, etc., puis les lier à un modèle event_details secondaire pour les informations spécifiques à la bande. Suggéreriez-vous les modèles multiples ou y a-t-il un meilleur moyen de relier des groupes jouant plusieurs événements que de créer un modèle de détail d'événement reliant à l'événement principal que partagent plusieurs artistes? Devrais-je simplement créer un type d'identificateur d'événement unique sur la table des événements afin que je traite un événement avec un ID différent comme le même événement qu'un autre groupe joue? Le seul problème que je vois avec cela, c'est que je vais doubler une grande partie de ces données qui sont dans ma base de données ... Je veux essentiellement être en mesure de regarder les données de l'événement dites ok à cette date, l'artiste joue ce spectacle, sur ce site, avec ces autres groupes sans avoir à faire simplement une colonne "other_artists" où les groupes ne feraient que répertorier les artistes avec lesquels ils jouent.

désolé j'espère que cela a du sens ... merci d'avance pour tout conseil!

Répondre

0

Je pense que votre vrai problème ici est que vous allez devoir gérer une relation plusieurs-à-plusieurs entre les artistes et les événements. Les événements auront de nombreux artistes réservés, et les artistes auront de nombreux événements sur leur calendrier.

Je créerais une classe «Réservation» qui relie spécifiquement un artiste à un événement. Cette réservation sera un bon endroit pour tenir des exigences spéciales ou des arrangements spéciaux pour cet artiste jouant à cet événement. L'utilisation de la relation "has_many: through" d'ActiveRecord rendra cela très simple et vous donnera beaucoup de flexibilité dans la façon dont vous pouvez interroger les données. Voici comment je le ferais:

class Event < ActiveRecord::Base  
    belongs_to :venue 
    has_many :artists, :through => :bookings 
    scope :upcoming, where('date >= ?', Date.today) 
end 

class Venue < ActiveRecord::Base 
    has_many :events 
    accepts_nested_attributes_for :events 
end 

class Artist < ActiveRecord::Base 
    has_many :events, :through => :bookings 
end 

class Booking < ActiveRecord::Base 
    belongs_to :artist 
    belongs_to :event 
    attr_accessible :special_requirements, :special_arrangements 
end 

Voici quelques exemples de la flexibilité que vous obtenez dans la recherche de données par l'intermédiaire de ces relations:

@venue.events 
@venue.events.where(:id => specific_event.id).first.artists 
@event.artists 
@artist.events 
@event.bookings each do |b| 
    b.artist 
    b.special_requirements 
end 

Hope this helps.

+0

oui je pense que vous avez raison. Merci pour l'aide. – brent

+0

Comment voulez-vous mettre à jour le modèle de réservation? Accepteriez-vous un attribut imbriqué via Venue et le mettrais-je à jour de la même façon que le modèle d'événement normal? – brent

+0

Je gérer des réservations à travers des événements. Le contrôleur d'événement aurait les actions "new_booking" et "update_booking" avec les vues associées. Dans la vue Événement #, vous pouvez ajouter un lien "nouvelle réservation" à l'action new_booking. Dans l'action new_booking, vous définissez la relation de réservation d'événement avec: '@booking = @ event.booking.new'. Ensuite, dans la vue associée, vous autorisez l'utilisateur à sélectionner un artiste et à entrer dans des exigences/dispositions particulières. Les événements doivent accepter des attributs imbriqués pour les réservations. –