2012-02-25 226 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

    相關問題