Множественные отношения к одной модели в Rails

Let's say I have two models, Classes and People. A Class might have one or two People as instructors, and twenty people as students. So, I need to have multiple relationships between the models -- one where it's 1->M for instructors, and one where it's 1->M for students.

Изменить: инструкторы и учащиеся must будут одинаковыми; преподаватели могут быть учащимися в других классах, и наоборот.

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

0
добавлено отредактировано
Просмотры: 30

2 ответы

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

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
0
добавлено
Эй, это довольно умно, но, к сожалению, кто-то может быть и инструктором, и учеником, поэтому я не думаю, что это будет работать как есть.
добавлено автор Tim Sullivan, источник
Ах, просто видел твою правку! Фантастика!
добавлено автор Tim Sullivan, источник
ха-ха, это было давно, но не должно быть отношений с has_many: через оба «направления»? Человек должен уметь обучать более одного курса?
добавлено автор wuliwong, источник

в моем случае у меня есть модель 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
0
добавлено
Разве это не ограничивает Личность наличием не более одного курса и одного курса_инструктора? Я думаю, чтобы полностью настроить его, они должны быть has_many: через ассоциации.
добавлено автор wuliwong, источник