Rails:find_by进行额外的sql查询,以前确实包含了

时间:2014-10-31 17:08:27

标签: activerecord ruby-on-rails-4

我有三节课:

class Batch
  has_many :final_grade_batches
end

class FinalGradeBatch
  belongs_to :batch
  belongs_to :student
end

class Student
  has_many :final_grade_batches
end

我想通过以下方式检索final_grade_batch

batch = Batch.includes(:final_grade_batches).find(1)
batch.final_grade_batches.find_by(student_id: 2)

最后一行产生这个SQL查询:

FinalGradeBatch Load (0.6ms)  SELECT "final_grade_batches".* FROM "final_grade_batches" WHERE "final_grade_batches"."batch_id" = $1 AND "final_grade_batches"."student_id" = 2 LIMIT 1  [["batch_id", 1]]

如果我在final_grade_batches Batch查询中加入find,为什么还要再次查找final grade batch?我知道它需要找到具有学生ID的那个,但是Rails应该进行查询才能得到它吗?它现在还没有加载到内存中吗?

有没有办法在没有Rails再次访问数据库的情况下获得final grade batch?谢谢!

1 个答案:

答案 0 :(得分:0)

find_by始终进行数据库查询。用以下代替:

batch.final_grade_batches.select( |grade_batch| grade_batch.student_id == 2).first

这适用于您已从数据库加载的数组,而不是执行其他查询。