【发布时间】:2013-05-10 19:05:25
【问题描述】:
编辑 - 使用 'includes' 会生成一个 SQL 'IN' 子句。使用 Oracle 时,这有 1,000 个项目的限制。它不适用于我的公司。还有其他解决方案吗?
是否可以在关联上预先加载关联?
例如,假设我有一个学院课程,一个学院有很多学生。每个学生都属于_to student_level
class Academy < ActiveRecord::Base
has_many :students
end
class Student < ActiveRecord::Base
belongs_to :academy
belongs_to :student_level
end
class StudentLevel < ActiveRecord::Base
has_many :students
end
是否可以在 Academy 中定制关联,以便在我加载学生时,我总是将 student_level 与学生一起加载?
换句话说,我希望以下代码部分产生一到两个查询,而不是为每个学生生成一个查询:
@academy.students.each do |student|
puts "#{student.name} - #{student.student_level.level_name}"
end
我知道如果我将学生从关联更改为方法,我可以这样做,但我不想这样做,因为我无法在其他查询中引用学生作为关联。我也知道我可以通过以下方式在 SQL 中执行此操作,但我想知道是否有办法在我的关联上不使用 finder_sql 来执行此操作,因为现在我需要在我的默认范围更改时更新我的 finder_sql,这赢了'不预加载关联:
SELECT students.*, student_levels.* FROM students
LEFT JOIN student_levels ON students.student_level_id = student_levels.id
WHERE students.academy_id = ACADEMY_ID_HERE
【问题讨论】:
-
老问题,但关于编辑中提到的
.includes()生成的IN-clause:类方法.eager_load()可用于生成左外连接而不是in-clause:@ 987654321@ -
感谢更新
标签: ruby-on-rails activerecord associations eager-loading