Метод модели или переменная экземпляра контроллера, Ruby on rails 3 - PullRequest
0 голосов
/ 25 февраля 2012

Если у меня есть метод модели, например:

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

Ничего не возвращается?

Ответы [ 2 ]

3 голосов
/ 25 февраля 2012

Если вы заглянете в свой журнал, вы сможете проверить, попадает ли он в кэш или нет, для каждого вызова функции. Похоже, что это не влияет на кэш, поэтому запрос на загрузку подписчиков будет повторяться 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 голосов
/ 25 февраля 2012

Если мне нужно сделать .. я сделаю следующим образом

Внутри контроллера

@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 %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...