2009-12-01 5 views
0

J'ai créé une application dans Rails et j'ai généré deux modèles, un pour les étudiants et un pour les prix. Chaque étudiant peut avoir de nombreux prix, alors j'ai ajouté has_many: prix au modèle étudiant. J'ai également ajouté une boîte de sélection à la vue qui permet à l'utilisateur de créer de nouvelles récompenses:Travailler avec des boîtes de sélection (RoR)

<%= f.select :student_id, Student.find(:all).collect {|s| [s.name, s.id]} %> 

Ma question: Si je voulais donner à l'utilisateur la possibilité de créer un prix sans spécifier un étudiant, comment pourrais-je modifier la sélectionnez la case pour leur permettre de faire cela?

Je suis tout nouveau à Rails. Merci!

Répondre

1

Ce que vous décrivez est une relation de plusieurs à plusieurs. Ce que vous avez fait est juste une relation de un à plusieurs.

Dans une relation plusieurs à plusieurs, vous définissez plusieurs enregistrements indépendants de chaque côté et utilisez une table de jointure pour créer des liens entre eux. Dans une relation un-à-plusieurs, chaque enregistrement d'un côté est indépendant tandis que chaque enregistrement du même côté dépend de celui auquel il est lié.

exemples issus de vos questions:

plusieurs à plusieurs: Chaque étudiant peut avoir de nombreux prix, mais ne pas besoin d'être lié à un prix pour avoir un sens. Chaque prix peut être gagné par de nombreux étudiants, mais n'a pas besoin d'être lié à un étudiant pour avoir un sens. Les badges de StackOverflow en sont un parfait exemple.

un à plusieurs: Chaque étudiant peut avoir de nombreux prix, mais n'a pas besoin d'être lié à un prix pour avoir un sens. Chaque prix est unique à un seul étudiant.

Comment transformer votre relation à une relation plusieurs à plusieurs:

  1. créer une table qui a student_id distributions des prix et award_id colonnes.
  2. Supprimez la colonne student_id de la table des récompenses.
  3. Informe ActiveRecord des relations.

    class Student < ActiveRecord::Base 
        has_many :awardings 
        has_many :awards, :through => :awardings 
        ... 
    end 
    
    class Awarding < ActiveRecord::Base 
        belongs_to :student 
        belongs_to :award 
    end 
    
    class Award < ActiveRecord::Base 
        has_many :awardings 
        has_many :students, :through => :awardings 
    end 
    
  4. Mettez à jour vos formulaires pour refléter les modifications.

    Utilisez une zone de sélection multiple ou une série de cases à cocher pour en gérer plusieurs à la fois. Il existe de nombreux tutoriels à ce sujet. Ce Railscast episode est un peu démodé mais c'est un bon début.

P.S. Vous avez plus de chances d'obtenir des réponses si vous ne cochez pas la case wiki de la communauté. Les wikis communautaires sont pour des questions non techniques, où les réponses sont susceptibles d'être améliorées par plusieurs utilisateurs.

Questions connexes