我在视图中有以下代码:
<% if @user.get_products.any? %>
<%= f.select('products', @user.get_products.collect { |user| [user.name, user.id]}) %>
get_products
正在向DB发出ActiveRecord
查询。所以我想知道它是否实际上做了两个相同的查询或使用第二次调用的第一个查询的缓存结果?我试图在服务器日志中检查它 - 但什么也没找到。我还想知道我是否可以以某种方式控制此行为,即为此视图设置/取消设置缓存。
谢谢!
更新:
我认为它也违反了MVC,但令我困惑的是IDE警告:“视图不应该与控制器共享两个以上的变量。”
但是,我创建了一个“单页”网站,因此我需要在同一视图中使用@user
,@nearest_users
和@user_products
。所以我发现了以下文章:
http://matthewpaulmoore.com/post/5190436725/ruby-on-rails-code-quality-checklist#instances
其中说
每个控制器之间只共享一个或两个实例变量 和观点。
实例变量地狱 - 当共享许多实例变量时 在控制器和视图之间 - 在Rails中很容易做到。这也是 对性能有潜在危险,因为你可以最终制作 在不知不觉中重复调用关联。相反,你的控制器 应该只管理一个实例变量 - 也许只需要一秒钟 current_user。这样,所有对关联的调用都会被加载 需求“,可以在一个地方缓存实例变量。
这种方法对于片段缓存也很有用,因为你 可以在实际加载关联之前检查视图中的缓存。
例如,不要让您的Blog控制器创建实例 @post和@related_posts的变量,只需制作一个方法, @post,并给你的Post模型一个related_posts方法,所以你可以 只需在您的视图中调用@ post.related_posts即可。
答案 0 :(得分:2)
要回答您的问题:查看中的查询不会被缓存。
此外,ERB模板中的Ruby代码是使用eval
执行的,效率非常低。
所以我的建议是:避免在视野中编写逻辑,这是一种不好的做法。