2010-02-03 3 views
2

Je souhaite modéliser la relation d'une personne avec une autre personne, où la relation n'est pas nécessairement hiérarchique (ie amis & collègues, plutôt que parent & enfants) et je suis intéressé à saisir plus de détails sur chaque relation (par exemple, les notes, le type de relation, la date d'établissement). Enfin, j'aimerais utiliser la relation act_as_tree pour pouvoir naviguer/schématiser ces relations.Modéliser une relation de personne à personne dans Ruby-on-Rails en utilisant has_many: à travers

Les migrations:

class CreateProfiles < ActiveRecord::Migration def self.up 
    create_table :profiles do |table| 
     table.column :firstName, :string 
     table.column :lastName, :string 
     table.column :telephone, :string 
     table.column :emailAddress, :string 
     table.column :location, :string 
     table.timestamps 
    end end def self.down 
    drop_table :profiles end end 

class Relationship < ActiveRecord::Migration def self.up 
    create_table :relationships, :id => false do |table| 
     table.column my_id :integer 
     table.column your_id :integer 
     table.column relationshipType :string 
     table.column dateEstablished :date 
     table.column notes :text 
     table.timestamps  end end def self.down 
    drop_table :relationships end end 

Les modèles:

class Person < ActiveRecord::Base 
    has_many :relationships, :foreign_key => "my_id" 
    has_many :persons :through => :relationships 
end 

class Relationship < ActiveRecord::Base 
    belongs_to :persons 
    acts_as_tree 
end 

Questions:

  1. Comment définir les relations entre ces tables correctement?
  2. Comme la combinaison my_id/your_id est unique, est-il sensé d'éliminer le: id de la table des relations?
  3. Y a-t-il de meilleurs noms pour les champs 'your_id' de my_id 'my_id' pour utiliser les conventions de RoR?
  4. Aurai-je des difficultés avec la relation act_as_tree si l'une des colonnes n'est pas nommée 'parent_id'?

Répondre

2
  1. a demandé seulement il y a quelques jours, une question similaire: “Many-to-many relationship with the same model in rails?”. J'ai essayé de documenter largement comment faire des associations en boucle là-bas. Cela vous aidera peut-être?

  2. Les tables sans ID dans Rails sont uniquement vues avec une association has_and_belongs_to_many. Avec les associations has_many :through normales, le modèle de la table de jointure est comme n'importe quel autre modèle d'ActiveRecord, et exige une colonne d'identification

  3. Je ne suis pas au courant d'une bonne convention ici, mais ces exemples sont un peu étranges. Vous auriez accès à eux comme relationship.your, ce qui me semble un peu gênant personnellement. Peut-être your_person_id, qui serait accessible comme relationship.your_person, et préciser que vous avez affaire à une instance Person? Une autre option pourrait être relationship.you.

  4. Je ne l'ai jamais utilisé acts_as_tree, mais vous pouvez l'appeler avec un paramètre comme ceci: acts_as_tree :foreign_key => 'my_id'

Comme je l'ai mentionné dans ma réponse à la other question, il semble que votre plus grande difficulté sera bi relations -directionnelles. Une fois qu'une personne A est connectée à une personne B, il n'est pas impliqué que cette personne B est connectée à la personne A. Cela est malheureusement difficile à accomplir dans ActiveRecord, d'après ce que je peux dire.

+0

La manière la plus simple de gérer la relation réciproque pourrait être de créer les deux directions en même temps. Il double la taille de la base de données, mais au moins les listes sont disponibles. – Eric

Questions connexes