RubyConf 我的 slide: 最佳實踐如何變成了最慢實踐

xdite · 2012年11月19日 · 最后由 zzzhc 回复于 2012年11月22日 · 4045 次阅读

加了 turbo-sprockets-rails3 之后不知道会不会提高 @import 'compass' 的速度

谢谢分享。

@xdite 不介意我偷几招到 rails-bestpractices.com 吧 :-)

都是很实用的干货,赞!

去不了大会,等视频。看看楼主的 slide,感受下气氛啊。

@flyerhzm 歡迎拿去 :p

state 加 limit,xx_at 用 integer 下次试试。

其实按照插入时间的排序,用 id 来排列就好了

匿名 #9 2012年11月20日

thanks for sharing

@xdite 请教下 35 页为什么 把 condition 放到 helper 里面要好过 在 view 里面呢

#10 楼 @knwang 因为 view 是用 eval 来执行的。

以后有问题,一定要多多像 @xdite 请教了。

我是 rails 门外汉,有个疑惑: 为什么在 controller 里面和 model 里面进行数据库的各种操作就有 cache,在 view 里面没有? 是不是可以认为:rails 遵守 MVC 的编程模式,而 MVC 的编程模式中,数据的读取和写入都是在 controller 和 model 里面完成的,所以 rails 在 controller 和 model 中对数据库操作进行了 cache。

如果我的猜测是对的,那么可否认为其实在 view 里面有数据库操作本身就是不对的,应该在 controller 里面读出数据?

很喜欢@xdite 说话的方式,干脆利落,技术也很厉害!

#11 楼 @yzhrain 还是不清楚,怎么用 eval 执行,用 eval 执行和性能有什么关系?

@xdite 不过好像如果使用了 cache do 的话把一些数据库 (例如一些数据需要贪婪查义的) 的操作放到视图里面的话,一但缓存下来了,就不用再查询数据库了吧,应该又能提高页面的响应速度吧。这样的话是不是又应该放到视图里面来呢?

#16 楼 @knwang eval 执行应该会比直接执行慢很多吧。

@xdite, 你是在 rails 代码里看到 activerecord 在不同环境下有不同的缓存策略吗? model 上对 association 的缓存跟代码运行的环境应该无关啊,association 是保存在 record 的实例方法上的,在 view 里 post.user 十次不会执行十次查询 (除非 user 不是用 association 定义的). 见 ActiveRecord::Associations::Builder::Association

另外,erb 并不是通过 eval 执行的。Rails 现在用 Erubis 来处理 erb, eruby 生成的 ruby 代码会 compile 成一个 ruby method 再执行,相关代码见: https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/action_view/template.rb#L265, https://github.com/rails/rails/blob/3-2-stable/actionpack/lib/action_view/template/handlers/erb.rb#L69

require 'erubis'
input = <<'END'
 <ul>
  <% for item in @list %>
   <li><%= item %></li>
  <% end %>
 </ul>
END
list = ['<aaa>', 'b&b', '"ccc"']
eruby = Erubis::Eruby.new(input)
puts eruby.src

# result:
_buf = ''; _buf << ' <ul>
';   for item in @list 
 _buf << '   <li>'; _buf << ( item ).to_s; _buf << '</li>
';   end 
 _buf << ' </ul>
';
_buf.to_s
需要 登录 后方可回复, 如果你还没有账号请 注册新账号