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

lilijreey · 发布于 2016年11月15日 · 最后由 lilijreey 回复于 2016年11月16日 · 340 次阅读
24996

代码如下

## 在模板中
-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
共收到 2 条回复
18898
flemon1986 · #1 · 2016年11月15日

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

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

@course = Course.includes(:lessons).where(...) #or .find(...)
24996
lilijreey · #2 · 2016年11月16日
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册