0

Я хотел бы запросить для разделов, относящихся к школам с этими моделями:Rails вложенных отношений в ActiveRecord

School 
    has_many :terms 

Term 
    belongs_to :school 
    has_many :departments 

Department 
    belongs_to :term 
    has_many :courses 

Courses 
    belongs_to :department 
    has_many :sections 

Section 
    belongs_to :course 

Я немного потеряли о том, как это сделать.

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

Любая помощь будет принята с благодарностью.

ответ

1

в должны перебирать каждую модель от верха до низа. Например:

s = School.find(1) 
s.terms.find(1).departments.find(1).courses.find(1).sections 

Это даст вам разделы, связанные с school_id = 1

С вашей модели имеет каскадный имеет много, вы должны идти, как это, если вы хотите изменить свою схему базы данных ..

0

Чтобы найти школу из раздела, вы бы просто сделать:

section.course.department.term.school 

Если не так много записей, чтобы замедлить это вниз, вы можете получить массив разделов для данной школы по do:

sections = [] 
school.terms.each do |term| 
    term.departments.each do |department| 
     department.courses.each do |course| 
     course.sections.each do |section| 
      sections << section 
     end 
     end 
    end 
end 

Это также даст вам доступ к каждой взаимосвязи между ними, если вам нужно выполнить дальнейшую обработку.

А вот terser версия:

sections = school.terms.map(&:departments).flatten.map(&:courses).flatten.map(&:sections).flatten 
1

Если вы работаете с Rails 3.1 или выше вы можете использовать: has_many: через, чтобы помочь вам получить участки, которые находятся в каждой школе. Во-первых, вам нужно настроить свои отношения в моделях:

School 
    has_many :terms 
    has_many :departments, :through => :terms 

Term 
    belongs_to :school 
    has_many :departments 

Department 
    belongs_to :term 
    has_many :courses 
    has_many :sections, :through => :courses 

Courses 
    belongs_to :department 
    has_many :sections 

Section 
    belongs_to :course 

Затем, чтобы получить участки для школы, вы можете сделать ...

School.first.departments.collect{|d| d.sections}.flatten! 

Чтобы получить школу, раздел принадлежит все, что вам нужно сделать, это

section.course.department.term.school

Смежные вопросы