Несколько отношений к одной и той же модели в Rails - PullRequest
12 голосов
/ 18 сентября 2008

Допустим, у меня есть две модели: классы и люди. В классе могут быть один или два человека в качестве инструкторов и двадцать человек в качестве студентов. Итак, мне нужно иметь несколько связей между моделями - одна, где 1-> M для преподавателей, и одна, где 1-> M для студентов.

Редактировать: преподаватели и студенты должны быть одинаковыми; преподаватели могут быть учениками в других классах, и наоборот.

Я уверен, что это довольно просто, но Google не раскрывает ничего важного, и я просто не нахожу это в своих книгах.

Ответы [ 2 ]

16 голосов
/ 18 сентября 2008

Здесь есть много вариантов, но при условии, что инструкторы всегда являются инструкторами, а студенты - студентами, вы можете использовать наследование:

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
6 голосов
/ 07 апреля 2011

в моем случае у меня есть модель активов и пользователей Актив может быть создан пользователем и может быть назначен пользователю и пользователь может создать много активов и может иметь много активов решение моей проблемы было 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...