新手问题 有关在 Action 中多次调用同一 SQL 查询的 cache 问题

lilijreey · 2016年11月15日 · 最后由 lilijreey 回复于 2016年11月16日 · 1580 次阅读

代码如下

## 在模板中
-if @course.lessons.last + 3.hours > Time.now
   p = @course.lessons.last.created_at
- else
  @course.lessons.each do |l|
    ....

上面有三次对@course所关联的 lessons 进行访问,第1/2次是对 lessons.last, 我看手册上手说 1.7 SQL Caching

Query caching is a Rails feature that caches the result set returned by each query. If Rails encounters the same query again for that request, it will use the cached result set as opposed to running the query against the database again.

在一个 action 中如果有多次相同的 SQL 查询那么只会实际查询一次,但是我看我这个例子每次都进行了查询! 请问是什么原因,如果优化?感谢

补充:

##多次调用
@course.lessons
@course.lessons
@course.lessons
##上面的三处调用只会执行一次

##但是这样会执行三次
@course.lessons.last
@course.lessons.last
@course.lessons.last

据我了解,rails 的 lazy load 使得 association query 只有在最后被调用的时候才会执行,@course.lessons 并不属于调用范畴,大概调用范畴是.first .all, .each

优化三次调用.last只执行一次数据查询,请用 rails 的 eagar load

@course = Course.includes(:lessons).where(...) #or .find(...)
需要 登录 后方可回复, 如果你还没有账号请 注册新账号