Множественные отношения к одной модели в 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