Ruby on rails 模型方法或控制器实例变量,Ruby on rails 3

Ruby on rails 模型方法或控制器实例变量,Ruby on rails 3,ruby-on-rails,variables,model,controller,Ruby On Rails,Variables,Model,Controller,如果我有一个模型方法,如: def favoured_users self.followers.limit(5).order("created_at") end 使用类似以下的视图块: <% 5.times do |i| %> <li><%= @user.favoured_users[i].name %></li> <% end %> 这会减少对服务器的调用吗 **编辑** 我不确定这是否意味着该值来自缓存,它似乎是(缓存的

如果我有一个模型方法,如:

def favoured_users
 self.followers.limit(5).order("created_at")
end
使用类似以下的视图块:

<% 5.times do |i| %>
  <li><%= @user.favoured_users[i].name  %></li>
<% end %>
这会减少对服务器的调用吗

**编辑**

我不确定这是否意味着该值来自缓存,它似乎是(缓存的bcos,但我不知道这是什么意思),但我没有明确告诉它,我是否必须做任何事情来确保它来自缓存:

User Load (0.6ms)  SELECT `users`.* FROM `users` INNER JOIN `relationships` ON `users`.`id` = `relationships`.`followed_id` WHERE `relationships`.`follower_id` = 1 ORDER BY full_name, created_at LIMIT 5
CACHE (0.0ms)  SELECT `users`.* FROM `users` INNER JOIN `relationships` ON `users`.`id` = `relationships`.`followed_id` WHERE `relationships`.`follower_id` = 1 ORDER BY full_name, created_at LIMIT 5
CACHE (0.0ms)  SELECT `users`.* FROM `users` INNER JOIN `relationships` ON `users`.`id` = `relationships`.`followed_id` WHERE `relationships`.`follower_id` = 1 ORDER BY full_name, created_at LIMIT 5
CACHE (0.0ms)  SELECT `users`.* FROM `users` INNER JOIN `relationships` ON `users`.`id` = `relationships`.`followed_id` WHERE `relationships`.`follower_id` = 1 ORDER BY full_name, created_at LIMIT 5
CACHE (0.0ms)  SELECT COUNT(*) FROM `users` INNER JOIN `relationships` ON `users`.`id` = `relationships`.`follower_id` WHERE `relationships`.`followed_id` = 1
User Load (0.5ms)  SELECT `users`.* FROM `users` INNER JOIN `relationships` ON `users`.`id` = `relationships`.`follower_id` WHERE `relationships`.`followed_id` = 1 ORDER BY full_name, created_at LIMIT 5
CACHE (0.0ms)  SELECT `users`.* FROM `users` INNER JOIN `relationships` ON `users`.`id` = `relationships`.`follower_id` WHERE `relationships`.`followed_id` = 1 ORDER BY full_name, created_at LIMIT 5
CACHE (0.0ms)  SELECT `users`.* FROM `users` INNER JOIN `relationships` ON `users`.`id` = `relationships`.`follower_id` WHERE `relationships`.`followed_id` = 1 ORDER BY full_name, created_at LIMIT 5
CACHE (0.0ms)  SELECT `users`.* FROM `users` INNER JOIN `relationships` ON `users`.`id` = `relationships`.`follower_id` WHERE `relationships`.`followed_id` = 1 ORDER BY full_name, created_at LIMIT 5
值是否从缓存返回

编辑我不确定如何从我的视图中访问变量,我有Sebi编辑的方法,在我看来,我正在尝试:

<% @user.favoured_followers do %>

  <li><%= @favoured.first.username unless @favoured.first.blank? %></li>
  <li><%= @favoured.second.username unless @favoured.second.blank? %></li>
  <li><%= @favoured.third.username unless @favoured.third.blank? %></li>
  <li><%= @favoured.fourth.username unless @favoured.fourth.blank? %></li>
  <li><%= @favoured.fifth.username unless @favoured.fifth.blank? %></li>

<% end %>


  • 没有返回任何内容?

    如果您查看日志,就可以验证每次调用函数时是否都会命中缓存。这似乎没有命中缓存,因此每个用户加载追随者的查询将重复5次。i、 e对于每个@user,您将触发查询5次。因此,将值缓存在变量中肯定是一个更好的主意

    编辑: 您可以这样更改模型方法:

    def favoured_users
        @favoured ||= self.followers.limit(5).order("created_at")
    end
    
    @favored变量将在第一次调用时创建,然后对于任何后续调用,它将在不触发查询的情况下返回

    您的视图代码应该保持不变,没有任何更改。i、 e:

    <% 5.times do |i| %>
      <li><%= @user.favoured_users[i].name  %></li>
    <% end %>    
    
    
    

  • 如果您查看日志,您将能够验证每次调用函数时是否命中缓存。这似乎没有命中缓存,因此每个用户加载追随者的查询将重复5次。i、 e对于每个@user,您将触发查询5次。因此,将值缓存在变量中肯定是一个更好的主意

    编辑: 您可以这样更改模型方法:

    def favoured_users
        @favoured ||= self.followers.limit(5).order("created_at")
    end
    
    @favored变量将在第一次调用时创建,然后对于任何后续调用,它将在不触发查询的情况下返回

    您的视图代码应该保持不变,没有任何更改。i、 e:

    <% 5.times do |i| %>
      <li><%= @user.favoured_users[i].name  %></li>
    <% end %>    
    
    
    

  • 如果我必须这样做。。我将按下面的方法做

    内部控制器

    @favoured_users = @user.followers.limit(5).order(:created_at)
    
    内部视图

    <% @favoured_users do |user| %>
      <li><%= user.name  %></li>
    <% end %>
    <% (5 - @favoured_users.count).times do%>
     <li>&nbsp;</li>
    <% end %>
    
    
    

  • 如果我必须这样做。。我将按下面的方法做

    内部控制器

    @favoured_users = @user.followers.limit(5).order(:created_at)
    
    内部视图

    <% @favoured_users do |user| %>
      <li><%= user.name  %></li>
    <% end %>
    <% (5 - @favoured_users.count).times do%>
     <li>&nbsp;</li>
    <% end %>
    
    
    

  • 我宁愿在模型中使用该方法,如何缓存模型中的值?。。。或者我必须从控制器调用model方法来设置一个变量吗?如果你这样循环就更好了
  • 我这样循环的原因是我希望即使只有3个用户返回,也能呈现5个li标记。在这种情况下,在你喜欢的\u users方法中,您可以执行类似于
    @favored_users | |=self.followers.limit(5).order(“created_at”)
    的操作您的意思是将此变量放入控制器中?或者在模型方法内部?我宁愿在模型中有方法,我如何缓存模型中的值?。。。或者我必须从控制器调用model方法来设置一个变量吗?如果你这样循环就更好了
  • 我这样循环的原因是我希望即使只有3个用户返回,也能呈现5个li标记。在这种情况下,在你喜欢的\u users方法中,您可以执行类似于
    @favored_users | |=self.followers.limit(5).order(“created_at”)
    的操作您的意思是将此变量放入控制器中?或者在模型方法中?这不会按我希望的方式工作。。。即使变量只包含3个用户,我也需要5个li标记来呈现。这不符合我的要求。。。即使变量只包含3个用户,我也需要5 li标记来呈现。Rails会尝试缓存每个请求的冗余查询。那些
    CACHE
    消息意味着它从缓存返回了一个值,而不是再次命中数据库。这是很有帮助的,但是您最好像Sebi的回答中那样显式缓存值,而不是依赖Rails来为您缓存。我现在理解了Brandon,谢谢。Rails确实尝试为每个请求缓存冗余查询。那些
    CACHE
    消息意味着它从缓存返回了一个值,而不是再次命中数据库。这是很有帮助的,但是您最好像Sebi的回答中那样显式缓存值,而不是依赖Rails来为您进行缓存。