2009-05-10 10 views
0

Je suis un début de ROR, mais voici ce que j'essaie d'atteindre. J'ai deux choses que je veux associer: les choses et les gens. Chaque affaire peut avoir beaucoup de gens. C'est-à-dire que je veux créer des personnes et des sujets séparément et ensuite pouvoir les lier.Ruby On Rails Relations - Un à plusieurs

Par exemple, je peux créer: Bill Clinton Barack Obama

je créer les questions: Le réchauffement climatique guerre contre le terrorisme

Je veux être en mesure d'associer les utilisateurs Bill Clinton Barack Obama aux deux sujets. Quelqu'un peut-il me diriger vers un tutoriel qui peut me montrer comment faire cela?

Répondre

2

Vous avez besoin d'une relation many2many entre ces deux entités.

  • Une question peut être étudiée par de nombreuses personnes
  • Une personne peut studie plusieurs questions

Rails utilise l'aide has_and_belongs_to_many pour le faire. Vous trouverez plus d'informations à ce sujet dans la documentation et de nombreux articles de blog!

has_and_belongs_to_many helper

0
class Politician < ActiveRecord::Base 
    has_and_belongs_to_many :tasks 
end 

class Task < ActiveRecord::Base 
    has_and_belongs_to_many :politicians 
end 

Qu'est-ce que vous avez besoin sont 3 tables: politicians, tasks et politicians_tasks (ayant les deux colonnes politician_id et task_id, aucune clé primaire)

Hope this helps Seb

4

I pense has_and_belongs_to_many est utilisé de moins en moins par la communauté RoR maintenant. Bien que toujours pris en charge, je pense qu'il est maintenant plus commun d'avoir un modèle intermédiaire (dans votre cas quelque chose comme PoliticianMatter) pour rejoindre vos modèles Politician et Matter.

Ensuite, votre table politician_matter aura un PK, un politician_id et un matter_id.

Ensuite, vous avez

class PoliticanMatter < ActiveRecord::Base 
    belongs_to :politician 
    belongs_to :matter 
end 

L'avantage de cette approche est que s'il y a jamais besoin d'être des propriétés futures du politique -> Peu importe la relation (par exemple, l'importance, la date de la dernière occurrence) que vous avez un modèle accorde cela - has_and_belongs_to_many ne prendrait pas en charge l'ajout de ces propriétés supplémentaires.

Vous pouvez également accéder à plusieurs à plusieurs directement de la politique et des modèles comme celui-ci la matière

class Politician < ActiveRecord::Base 
    has_many :politician_matters 
    has_many :matters, :through => :politician_matters 
end 

class Matter < ActiveRecord::Base 
    has_many :politician_matters 
    has_many :politicians, :through => :politician_matters 
end