2012-02-25 130 views
0

如果我有象模型的方法:模型法或控制器实例变量,Ruby on Rails的3

def favoured_users 
self.followers.limit(5).order("created_at") 
end 

与像一个视图块:

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

...将我被调用favoured_user方法五次,每次请求5个用户,最终得到25个被调用的用户?

我只是想知道我是否应该把favoured_users的结果在一个变量在我的控制器来代替:

@favoured_users = @user.followers.limit(5).order("created_at") 

那是要到服务器更少电话?

**编辑**

我不知道这是否意味着该值从缓存中来,看来它是(缓存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 

是值从缓存中返回?

编辑我不知道如何从我的观点访问变量,我有方法按塞比的编辑和在我看来,我想:

<% @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 %> 

没有被退回?

+0

Rails会尝试缓存每个冗余查询请求。那些'CACHE'消息意味着它从缓存中返回一个值,而不是再次访问数据库。这很有帮助,但在Sebi的答案中,您最好明确缓存值,而不要依靠Rails为您做。 – Brandan 2012-02-25 17:16:59

+0

我现在明白布兰登谢谢。 – Darcbar 2012-02-26 13:28:23

回答

3

如果你看看你的日志,你将能够验证它是否打到缓存或不是每次调用函数。这似乎没有达到缓存,因此加载关注者的查询将为每个用户重复5次。即对于每个@user,您将触发该查询5次。因此,将值缓存在变量中肯定是一个更好的主意。

编辑: 你可以改变你的模型方法是这样的:

def favoured_users 
    @favoured ||= self.followers.limit(5).order("created_at") 
end 

的@favoured变量将要创建的第一次这就是所谓的,然后任何后续调用将不退还查询被解雇。

您的视图代码应保持不变。即:

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

我宁愿在模型中使用该方法,我将如何去缓存模型中的值?或者我必须从控制器调用模型方法来设置变量? – Darcbar 2012-02-25 11:06:50

+0

如果以这种方式循环,它会更好<%@ user.favoured_users.each do | user | %>

  • <%= user.name%>
  • <% end %> – DeathHammer 2012-02-25 11:58:58

    +0

    我循环的原因是因为即使只有3个用户返回,我也希望5个li标记进行渲染。 – Darcbar 2012-02-25 12:33:08

    0

    如果我必须做的..我会做下面的方式

    内部控制

    @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 %> 
    
    +0

    这不会工作,我希望它能够工作......即使变量仅包含3个用户,我也需要5个li标记进行渲染。 – Darcbar 2012-02-25 16:51:25

    +0

    已编辑答案全部显示5个标签 – 2012-02-25 17:51:53

    相关问题