Rails在ActiveRecord中嵌套关系

时间:2013-03-04 18:45:16

标签: sql ruby-on-rails ruby-on-rails-3 activerecord 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

我对如何做到这一点有点失落。

我希望能够调用属于学校的部分列表,并从部分找到学校(并查询其间的所有关系)

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

如果您正在使用Rails 3.1或更高版本,您可以使用:has_many:through来帮助您获取每所学校内的部分。首先,您需要在模型中设置关系:

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

答案 1 :(得分:1)

必须从上到下遍历每个模型。 例如:

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

这将为您提供与school_id = 1

相关联的部分

由于你的模型有级联很多,你必须这样做,除非你想改变你的数据库模式..

答案 2 :(得分:0)

要从某个部分找到学校,您只需:

section.course.department.term.school

如果没有那么多记录可以减缓这种情况,你可以通过以下方式获得给定学校的一系列部分:

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

如果您需要进行任何进一步处理,这也可以让您访问中间的每个关系。

这是一个更简洁的版本:

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