2012-02-25 17 views
0

私のようなモデルメソッドがある場合:ようなビューブロックとモデル法やコントローラのインスタンス変数、ルビー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回、毎回5人のユーザーを求め、25人のユーザーが呼び出されるようにします。

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

は、それがサーバーに少なく呼び出しを次のようになります。私は代わりに私のコントローラで変数にfavoured_usersの結果を置く必要がある場合

私は思ったんだけど?

** EDIT **

私は、これは値がキャッシュから来ている意味ならば、それは表示されます(CACHEのbcosが、私はそれが何を意味するのかthatsの知らない)わからないんだけど、私は明示的に、私は必ずそれがキャッシュあちこちに来るん作るために何かをしなければならないの、それを告げていない。

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

何も返されている:私は私のビューから変数にアクセスするかどうかはわかりません

EDITは、私がしようとしていますSEBIの編集あたり、私のビューのような方法がありますか?

+0

のRailsを行いますあたりの冗長クエリをキャッシュしようとする試みを行います要求。それらの 'CACHE'メッセージは、データベースに再びヒットするのではなく、キャッシュから値を返したことを意味します。これは役に立ちますが、セビの答えのように明示的にキャッシングする価値は、Railsがあなたのために行うよりも優れています。 – Brandan

+0

私は今Brandonに感謝します。 – Darcbar

答えて

3

ログを見ると、その関数の呼び出しごとにキャッシュにヒットしているかどうかを確認できます。これは、キャッシュに当たっているようには見えないので、フォロワーをロードするクエリは、各ユーザーに対して5回繰り返されます。つまり、@ユーザーごとにクエリを5回実行します。したがって、変数に値をキャッシングするのは良い考えです。

編集:@favoured変数は、これが初めて呼び出されたときに作成され、その後、任意の後続の呼び出しのためにそれをせずに返されます

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

あなたは、このようなモデルの方法を変更することができますクエリが実行されます。

あなたのビューコードは変更されずにそのまま残ります。すなわち:私がしなければならない場合

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

私はむしろモデルのメソッドを持っていますが、モデルから値をキャッシュするにはどうすればいいですか... ...または、モデルメソッドをコントローラから呼び出して変数を設定する必要がありますか? – Darcbar

+0

この方法でループする方が良いでしょう。<%@ user.favoured_users.each do | user | %>

  • <%= user.name%>
  • <% end %> – DeathHammer

    +0

    私は私の方法をループしている理由は、ユーザーが3人しか戻っていない場合でも5つのliタグをレンダリングしたいということです。 – Darcbar

    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

    +0

    編集した回答を5件のタグすべてを表示する –

    関連する問題