Я хотел бы создать отношение самореференции в рельсах. У меня есть модель Person, и у человека должны быть мастера и ученики с одним и тем же объектом Person.Использование полиморфного отношения «многие-ко-многим» с привязкой к атрибутам относительно отношения в рельсах
До сих пор я пытался:
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
Это похоже на работу, когда я пытаюсь выбрать:
@a = Person.find(:first)
@a.masters
, но когда я пытаюсь сделать толчок в мастера, он сохраняет отношения без статус установлен на мастер. Вместо этого он сохраняет нуль. Есть ли простой способ сэкономить status=master
, когда я нажимаю на мастеров и status=pupil
, когда я нажимаю учеников?
Благодаря
Это то, что я думал, мне понадобятся рельсы 3. Как обратно совместима r3? Хотя я, вероятно, не могу ничего потерять с хорошей резервной копией;) Я пробовал это решение, но у меня есть 2.3.8, и он еще не имеет обратных вызовов ассоциации. Я проверил valid_keywords в источнике для этого;) Спасибо, человек, я вернусь к этому завтра, но я думаю, что это прекрасно, поскольку я попробовал, только версия не соответствовала. – Tamisoft
Хорошо, похоже, что он отлично работает на 2.3.8, хотя некоторые говорили на форумах, что у него могут быть ошибки, но пока я все настроен. Большое спасибо за помощь. – Tamisoft
проблем нет. просто проголосовать за мой ответ, и это будет здорово :) – hellvinz