1

在我看来,我有以下代码:

<% if @user.get_products.any? %>
  <%= f.select('products', @user.get_products.collect { |user| [user.name, user.id]}) %>

在哪里对 DBget_products进行查询。ActiveRecord所以我想知道它是否真的执行两个相同的查询或在第二次调用时使用第一个查询的缓存结果?我试图在服务器日志中检查它 - 但什么也没找到。我还想知道我是否可以以某种方式控制这种行为,即为此视图设置/取消设置缓存。

谢谢!

更新:

我认为它也违反了 MVC,但让我感到困惑的是 IDE 警告:“视图不应与控制器共享两个以上的变量。”

但是,我正在创建有点“单页”的网站,所以我需要在同一个视图中拥有@user@nearest_users和。@user_products所以我找到了以下文章: http:
//matthewpaulmoore.com/post/5190436725/ruby-on-rails-code-quality-checklist#instances

其中说

每个控制器和视图之间只共享一个或两个实例变量。

实例变量地狱 - 当控制器和视图之间共享大量实例变量时 - 在 Rails 中很容易做到。这对性能也有潜在的危险,因为您最终可能会在不知不觉中对关联进行重复调用。相反,您的控制器应该只管理一个实例变量 - 可能还有第二个用于 current_user。这样,所有对关联的调用都是“按需”加载的,并且可以在一个地方缓存实例变量。

这种方法也适用于片段缓存,因为您可以在实际加载关联之前检查视图中的缓存。

例如,不要让您的博客控制器为@post 和@related_posts 创建一个实例变量,只需创建一个方法@post,并为您的帖子模型提供一个related_posts 方法,这样您就可以在您的意见。

4

1 回答 1

2

回答您的问题:视图中的查询不会被缓存。

此外,ERB 模板中的 Ruby 代码是使用 执行的eval,效率非常低。

所以我的建议是:避免在视图中编写逻辑,这是一种不好的做法。

于 2013-04-15T07:23:43.770 回答