ruby-on-rails - Rails - 关联上的渴望加载关联

标签 ruby-on-rails activerecord associations eager-loading

编辑 - 使用“includes”生成 SQL“IN”子句。使用 Oracle 时,有 1,000 个项目的限制。它不适用于我的公司。还有其他解决方案吗?

是否可以在关联上预先加载关联?

例如,假设我有一个学院类(class),一个学院有很多学生。每个学生属于_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.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 来预先加载数据?

class Academy < ActiveRecord::Base
  has_many :students

  # you can probably come up with better method name
  def students_with_levels
    # not sure if includes works off associations, see alternate below if it does not
    self.students.includes(:student_level)
  end

  def alternate
    Student.where("academy_id = ?", self.id).includes(:student_level)
  end
end

另请参阅:http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associations

应该会产生 3 个查询

  • 在学院的初步发现
  • 对 Student 对象集合的查询
  • 查询所有学生 StudentLevel 对象

补充:

# the same can be done outside of methods
@academy.students.includes(:student_level).each do |student|
  puts "#{student.name} - #{student.student_level.level_name}"
end

Student.where("academy_id = ?", @academy.id).includes(:student_level).each do |student|
  puts "#{student.name} - #{student.student_level.level_name}"
end

ActiveRelation 查询也是可链接的

@academy.students_with_levels.where("name ILIKE ?", "Smi%").each do # ...

有一篇关于 ActiveRecord 查询(方法)封装的好文章 - http://ablogaboutcode.com/2012/03/22/respect-the-active-record/

关于ruby-on-rails - Rails - 关联上的渴望加载关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16489186/

相关文章:

ruby-on-rails - Rails 必须并且属于许多正确的 Rails 协会吗?

ruby-on-rails - Has_one 关联应该是一个 has "only"一个关联

ruby-on-rails - rails : One-to-many association fails due to foreign key validation

ruby-on-rails - 大礼包安装错误 : Could not find gem 'spree_skrill (>= 0) ruby'

ruby-on-rails - 在 ubuntu 上以 root 身份运行的延迟作业进程

ruby-on-rails - Rail 的 default_scope 对性能的影响

ruby-on-rails - ActiveRecord 不适用于 App Engine - 有什么替代方案?

ruby-on-rails - Rails Pundit Rspec 测试

ruby-on-rails - 将 ActiveRecord 对象的所有属性(id、created_at、updated_at 除外)设置为 nil 的最简单方法是什么?

ruby-on-rails - Rails 2.3.5 连接到 SQL Server 2005