2012-01-07 3 views
0

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

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 

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

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

Спасибо.

ответ

0

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

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. Я уверен, что вы сможете это уточнить.