Это на самом деле не тот ответ, который вы ищете, но кажется, что сложность в создании этой ассоциации предполагает необходимость корректировки дизайна таблицы.
Если задать вопрос What if the user changes school?
, необходимо обновить школу как на Student
, так и на Guardian
, в противном случае модели не синхронизируются.
Я выдвинул, что ученик, опекун и школа, все имеют отношения вместе. Если ученик меняет школу, для новой школы создается новый Relationship
. В качестве приятного побочного эффекта это позволяет существовать истории о том, где учился студент.
Связи belongs_to
будут удалены из Student
и Guardian
и вместо этого перемещены в Relationship
.
Затем фабрику можно изменить, чтобы она выглядела следующим образом:
factory :relationship do
school
student
guardian
relationship_type
end
Это может быть использовано следующими способами:
# use the default relationship which creates the default associations
relationship = Factory.create :relationship
school = relationship.school
student = relationship.student
guardian = relationship.guardian
# create a relationship with a guardian that has two charges at the same school
school = Factory.create :school, name: 'Custom school'
guardian = Factory.create :guardian
relation1 = Factory.create :relationship, school: school, guardian: guardian
relation2 = Factory.create :relationship, school: school, guardian: guardian
student1 = relation1.student
student2 = relation2.student