0

que je cherche à ce railscast #17 revised comme un tutoriel pour créer une relation plusieurs à plusieurs entre deux modèles en utilisant une table de jointure:Rails: plusieurs à plusieurs - création et associer de nouveaux records

class Course < ActiveRecord::Base 
has_many :courselocalizations 
has_many :courselocations, through: :courselocalizations 
end 

class Courselocation < ActiveRecord::Base 
has_many :courselocalizations 
has_many :courses, through: :courselocalizations 
end 

class Courselocalization < ActiveRecord::Base 
belongs_to :course 
belongs_to :courselocation 
end 

Si l'utilisateur ne voit pas un existant courselocation lors de l'édition ou la création du course, quelle est la meilleure façon pour eux de créer un nouveau courselocation et de faire automatiquement l'association?

Répondre

0

Vous pouvez le faire dans un processus en deux étapes (ma méthode préférée), ou en une seule étape.

2 étapes: - Créer le CourseLocation - Associer les CourseLocation et Course.

course_location1 = CourseLocation.create(name: 'location1') 
course.course_locations << course_location1 


Si vous voulez le faire en 1 étape, il est possible en utilisant l'Active Record accepts_nested_attributes_formethod, cela est un peu délicat. Voici un good article sur elle, mais nous allons briser les marches:

  1. Un cours doit accepter les attributs pour course_localizations
  2. Une localisation des cours doit accepter les attributs pour course_location
  3. Lors de la création d'un cours, passer les attributs pour une localisation qui contient les attributs d'un emplacement.

permet de définir tout ce pour votre cas particulier:

class Course < ActiveRecord::Base 
    # attribute subject 
    has_many :course_localizations, inverse_of: :course 
    has_many :course_locations, through: :course_localizations 
    accepts_nested_attributes_for :course_localizations 
end 

class CourseLocation < ActiveRecord::Base 
    # attribute city 
    has_many :course_localizations 
    has_many :courses, through: :course_localizations 
end 

class CourseLocalization < ActiveRecord::Base 
    belongs_to :course 
    belongs_to :course_location 
    accepts_nested_attributes_for :course_locations 
end 

À ce stade, vous devriez pouvoir

course = Course.new(
    subject: "Math", 
    course_localizations_attributes: [ 
    { course_location_attributes: { city: "Los Angeles" } }, 
    { course_location_attributes: { city: "San Francisco" } }] 
) 

course.save 
+0

Merci! J'ai fini par tester 'accept_nested_attributes_for' en utilisant un constructeur de formulaire sur les nouvelles vues/éditions' course' et en ajoutant '1.times {@ course.courselocations.build}' dans la nouvelle action du contrôleur de cours. Ce que je vais finir par faire est de charger le formulaire via ajax s'il n'y a pas déjà un emplacement de cours. Quel est le but d'ajouter 'accept_nested_attributes_for: course_locations' au modèle' courseelocalizations'? –

+0

Il est donc explicite que vous puissiez passer des attributs 'course_location' dans le modèle' course_localizations' et qu'ils soient transmis à 'course_locations'. Vous devez passer les attributs 2 couches profondes. Si vous êtes déjà en train de configurer l'ajax, je considérerais sérieusement ne pas utiliser 'accept_nested_attributes_for' et je ferais juste 2 requêtes API séparées. Bonne chance – Correlator

+0

Merci - quel est l'inconvénient d'utiliser 'accept_nested_attributes_for' dans un formulaire ajax? Aussi, je suppose que je ne suis pas clair comment j'utiliserais le processus en deux étapes que vous mentionnez ci-dessus si c'est ce que vous appelez les 2 demandes d'API distinctes. –