Je voudrais créer une relation d'auto-référencement dans les rails. J'ai un modèle Personne, et la personne devrait avoir des maîtres et des élèves avec le même objet Personne.Utilisation de la relation d'auto-référencement polymorphe plusieurs-à-plusieurs avec les attributs de la relation dans les rails
Jusqu'à présent, j'ai essayé:
class Person <ActiveRecord::Base
has_many :relationships, :dependent => :destroy
has_many :masters, :through => :relationships, :conditions => "status='master'"
has_many :pupils, :through => :relationships, :conditions => "status='pupil'"
has_many :inverse_relationships, :class_name => "Relationship",
:foreign_key => "related_id"
has_many :inverse_masters, :through => :inverse_relationships,
:source => :person, :conditions => "status='master'"
has_many :inverse_pupils, :through => :inverse_relationships,
:source => :person, :conditions => "status='pupil'"
end
class Relationship < ActiveRecord::Base
belongs_to :person
belongs_to :master, :class_name => "Person", :foreign_key => 'related_id'
belongs_to :pupil, :class_name => "Person", :foreign_key => 'related_id'
end
Il semble fonctionner quand je suis en train de sélectionner:
@a = Person.find(:first)
@a.masters
mais lorsque je tente de faire une poussée en maîtres, il sauve la relation sans l'état défini sur maître. Il économise null à la place. Y at-il un moyen facile d'enregistrer status=master
quand je pousse dans les maîtres et status=pupil
quand je pousse dans les élèves?
Merci
C'est ce que je pensais, je vais avoir besoin de rails 3 pour cela. Comment rétrocompatible est r3? Bien que je ne puisse probablement rien perdre avec une bonne sauvegarde;) J'ai essayé cette solution mais j'ai 2.3.8 et il n'y a pas encore les rappels d'association. J'ai vérifié le valid_keywords dans la source pour cela;) Merci, j'y reviendrai demain, mais je suppose que c'est parfait, comme je l'ai essayé, seule la version ne correspond pas. – Tamisoft
OK, il semble que cela fonctionne parfaitement sur 2.3.8 aussi, bien que certains ont dit sur les forums qu'il pourrait avoir des bugs, mais pour l'instant je suis prêt. Merci beaucoup pour l'aide – Tamisoft
aucun problème. il suffit de voter pour ma réponse et ce sera génial :) – hellvinz