Как я могу связать учеников со школой через два уровня (курсы и разделы курса) в рельсах 3.1? - PullRequest
0 голосов
/ 07 января 2012

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

Class School < ActiveRecord::Base
  has_many :courses
  has_many :sections, :through => courses
  has_many :students, :through => courses, :through => sections, :through => enrollments
end

Class Course < ActiveRecord::Base
  belongs_to :school
  has_many :sections
  has_many :students, :through => sections, :through => enrollment
end

Class Section < ActiveRecord::Base
  belongs_to :course
  has_many :students, :through => enrollment
end

Class Student < ActiveRecord::Base
  has_many :sections, :through => enrollment
  has_many :courses, :through => sections, :through => enrollment
  has_many :schools, :through => courses, :through => sections, :through => enrollment
end

Зачисление - это просто таблица с идентификатором раздела и идентификатором студента, когда студент записывается в этот раздел курса.

Есть ли лучший способ сделать то, что я пытаюсь сделать здесь?

Спасибо.

1 Ответ

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

Я не уверен, правильно ли я вас понял, но я бы сделал несколько иной набор отношений: В школе много курсов, в курсе много секций, в секции много учеников. Это привело бы к следующим моделям:

class School < ActiveRecord::Base
  has_many :courses
end

class Course < ActiveRecord::Base
  belongs_to :school
  has_many :sections
end

class Section < ActiveRecord::Base
  belongs_to :course
  has_many :enrollments
  has_many :students, :through => :enrollment
end

class Enrollment < ActiveRecord::Base
  belongs_to :section
  belongs_to :student
end

class Student < ActiveRecord::Base
  has_many :enrollments
  has_many :courses, :through => :enrollment
end

Это позволило бы правильно ссылаться на все виды данных. Например, я хотел бы видеть всех студентов всех секций всех курсов первой школы. Я бы тогда использовал что-то вроде этого: School.first.courses.map(&:sections).flatten.map(&:students).flatten. Я уверен, что вы могли бы уточнить это дальше.

...