Множественные отношения к одной модели в Rails
Скажем, у меня есть две модели: классы и люди. У класса может быть один или два человека в качестве инструкторов и двадцать человек в качестве учеников. Таким образом, мне нужно иметь несколько взаимосвязей между моделями - одно, где для инструкторов - 1- > M, и одно, где для студентов - это 1- > M.
Изменить: инструкторы и студенты должны быть одинаковыми; инструкторы могут быть учащимися в других классах и наоборот.
Я уверен, что это довольно просто, но Google не подтягивает ничего важного, и я просто не нахожу его в своих книгах.
Ответы
Ответ 1
Здесь много вариантов, но при условии, что инструкторы всегда являются инструкторами, а учащиеся всегда учатся, вы можете использовать наследование:
class Person < ActiveRecord::Base; end # btw, model names are singular in rails
class Student < Person; end
class Instructor < Person; end
затем
class Course < ActiveRecord::Base # renamed here because class Class already exists in ruby
has_many :students
has_many :instructors
end
Просто помните, что для наследования отдельной таблицы для работы вам нужен столбец type
в таблице people
.
Использование модели ассоциации может решить вашу проблему
class Course < ActiveRecord::Base
has_many :studentships
has_many :instructorships
has_many :students, :through => :studentships
has_many :instructors, :through => :instructorships
end
class Studentship < ActiveRecord::Base
belongs_to :course
belongs_to :student, :class_name => "Person", :foreign_key => "student_id"
end
class Instructorship < ActiveRecord::Base
belongs_to :course
belongs_to :instructor, :class_name => "Person", :foreign_key => "instructor_id"
end
Ответ 2
в моем случае у меня есть модель Asset и User
Активы могут быть созданы пользователем и могут быть назначены пользователю
и Пользователь может создать много активов и может иметь много активов
решение моей проблемы было asset.rb
class Asset < ActiveRecord::Base
belongs_to :creator ,:class_name=>'User'
belongs_to :assigned_to, :class_name=>'User'
end
и
user.rb
class User < ActiveRecord::Base
has_many :created_assets, :foreign_key => 'creator_id', :class_name => 'Asset'
has_many :assigned_assets , :foreign_key => 'assigned_to_id', :class_name => 'Asset'
end
поэтому ваше решение может быть
class Course < ActiveRecord::Base
has_many :students ,:foreign_key => 'student_id', :class_name => 'Person'
has_many :teachers, :foreign_key => 'teacher_id', :class_name => 'Person'
end
и
class Person < ActiveRecord::Base
belongs_to :course_enrolled,:class_name=>'Course'
belongs_to :course_instructor,:class_name=>'Course'
end