Ассоциации Rails - как я могу установить ассоциации для разных типов пользователей? - PullRequest
1 голос
/ 07 января 2012

Я создаю веб-приложение, которое состоит из школ, курсов, студентов и учителей.

В школе может быть много курсов, а в курсе один учитель и много учеников.

Проблема, с которой я сталкиваюсь, заключается в том, что один пользователь может быть учителем одного курса, но студентом другого курса (или даже студентом или преподавателем курса в другой школе).Я не хочу создавать модель для учителей и отдельную модель для студентов, потому что я хотел бы отслеживать всех своих пользователей в одном месте.Существует таблица регистрации, в которой указано, какие пользователи записаны на курс в качестве студентов.

Я хотел бы сделать что-то вроде следующего:

class School < ActiveRecord::Base
  has_many :courses
  has_many :students :through enrollments
  has_many :teachers :through courses
end

class Course < ActiveRecord::Base
  has_one :teacher
  belongs_to :school
  has_many :students :through enrollments
end

class User < ActiveRecord::Base
  has_many :courses
  has_many :schools
end

Но если у меня есть только таблица пользователейа не два отдельных стола учеников и учителей, это не сработает.

Вместо этого мне придется сделать что-то вроде

class School < ActiveRecord::Base
  has_many :users [that are teachers]
  has_many :users :through enrollments [that are students]
end

Как мне настроить свою модель и ассоциации, чтобы создатьэто работа?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 07 января 2012

Использовать наследование.

Учителя и ученики наследуются от модели пользователей.Вы можете проконсультироваться http://api.rubyonrails.org/classes/ActiveRecord/Base.html для получения дополнительной информации.Обязательно создайте столбец «type» или эквивалент в вашей таблице User.

class User < ActiveRecord::Base
end

class Student < User
end

class Teacher < User
end

Rails будет обрабатывать их индивидуально, но они все равно будут существовать в таблице User. Дайте мне знать, если вам понадобится дополнительная помощь

0 голосов
/ 07 января 2012

Добавьте столбец teachers_id к courses и используйте belongs_to вместо has_one.Затем добавьте параметр class_name.

class School < ActiveRecord::Base
  has_many :courses
  has_many :students :through enrollments
  has_many :teachers :through courses
end

class Course < ActiveRecord::Base
  belongs_to :teacher, :class_name => 'User'
  belongs_to :school
  has_many :students :through enrollments
end

class User < ActiveRecord::Base
  has_many :courses
  has_many :schools, :through enrollments
  has_many :teachers, :through :courses
end
0 голосов
/ 07 января 2012

Возможно, я что-то пропустил, но это должно сработать, если вы добавите class_name в ваши отношения с "Пользователем":

class School < ActiveRecord::Base
  has_many :courses
  has_many :students :through enrollments, :class_name => "User"
  has_many :teachers :through courses, :class_name => "User"
end

class Course < ActiveRecord::Base
  has_one :teacher, :class_name => "User"
  belongs_to :school
  has_many :students :through enrollments, , :class_name => "User"
end

class User < ActiveRecord::Base
  has_many :courses
  has_many :schools
end
...