Modèle une relation de personne à personne en Ruby-on-Rails en utilisant has_many: par
-
25-09-2019 - |
Question
Je voudrais modèle à une autre personne, où la relation est pas nécessairement hiérarchique de la relation d'une personne (c.-à-amis et collègues, plutôt que parents et enfants) et je suis intéressé à capturer plus de détails sur chaque relation (par exemple, des notes, type de relation, date de création). Enfin, je voudrais utiliser la relation de act_as_tree pour pouvoir naviguer / diagramme de ces relations.
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:
- Comment définir les relations entre ces tables correctement?
- Comme le mon_id / VOTRE_ID combinaison est unique, est-il logique d'éliminer l':? Id sur la table des relations
- Y at-il de meilleurs noms pour les champs « mon_id » et « votre_ID » pour faire usage des conventions de RoR?
- Vais-je avoir des difficultés avec la relation act_as_tree si l'une des colonnes est le nom pas « parent_id »?
La solution
-
Il y a tout juste quelques jours, on a posé une question similaire: « beaucoup à plusieurs avec le même modèle dans des rails? » . J'ai essayé de documenter longuement comment faire il y a des associations bouclées. Peut-être cela vous aidera dans?
-
Les tables sans ID dans Rails ne sont jamais vu avec une association de
has_and_belongs_to_many
. Avec les associationshas_many :through
régulières, le modèle de la table de jointure est comme tout autre modèle ActiveRecord, et nécessite une colonne ID -
Je ne suis pas au courant d'une bonne convention, mais ces exemples sont un peu étranges. Vous seriez les
relationship.your
comme accédez, ce qui me semble un peu maladroit personnellement. Peut-êtreyour_person_id
, qui serait accessible parrelationship.your_person
, et préciser que vous avez affaire à une instance dePerson
? Une autre option pourrait êtrerelationship.you
. -
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 autre question , il semble que votre plus grande difficulté sera les relations bi-directionnelles. Une fois qu'une personne A est connecté à une personne B, il ne laisse entendre que la personne B est connecté à personne A. C'est malheureusement difficile à accomplir dans ActiveRecord, de ce que je peux dire.