2015-01-24 2 views
0

Ищете способы улучшить особенно плохую производительность, которую я получаю от своего приложения для рельсов. Вот код на странице в вопросе:Плохая производительность в Rails App

notifications_controller.rb

class NotificationsController < ApplicationController 
    def index 
    @questions = Question.all.order(:updated_at => :desc) 
    @users = User.all 
    @answers = Answer.all.order(:updated_at => :desc) 
    end 
end 

и вот соответствующий вид. Я знаю, что это уродливо, но оно работает.

<div> 
<% if current_user %> 
    <div class="notifications-added col-md-8"> 
     <h4 class="col-md-offset-2">Approvals &amp; Answers</h4> 
     <span class="text-center"> 
      <% current_user.questions.order(id: :desc).each do |question| %> 
       <% if question.approved == true %> 
        Your question, <%= link_to "#{question.title}", question_path(question) %>, has been <span class="notifications">approved.</span><br> 
       <% end %> 

       <% question.answers.each do |answer| %> 
        <%= answer.user.name %> <span class="notifications">added an answer</span> to your question, <%= link_to "#{question.title}", question_path(question) %>.<br> 
       <% end %> 
      <% end %> 
     </span> 
    </div> 

    <div class="notifications-voted col-md-4"> 
      <h4 class="text-center">Votes</h4><span></span> 
      <% current_user.answers.order(updated_at: :desc).each do |answer| %> 
       <% @users.each do |user| %> 
        <% if user.voted_up_on? answer %> 
        <%= user.name %> <span class="notifications">upvoted</span> your answer to <%= link_to "#{Question.find(answer.question_id).title}", question_path(answer.question_id) %>.<br> 
        <% elsif user.voted_down_on? answer %> 
        <%= user.name %> <span class="notifications">downvoted</span> your answer to <%= link_to "#{Question.find(answer.question_id).title}", question_path(answer.question_id) %>. <br> 
        <% end %> 
       <% end %> 
      <% end %>  
     </div> 
    <% end %> 
</div> 

Я думаю, что я просто сортирую слишком много. Страница занимает много времени, чтобы загрузить. Что такое низкие висячие плоды для улучшения моей работы? Есть предположения? Заранее спасибо.

+1

Вы определяете две переменные '@questions, @ answers', но используются' current_user.questions' и 'current_user.answers'. почему вам нужна переменная @questions, @ answers', если вы ее не используете? –

ответ

1
  • Во-первых, вы должны переместить логический код в своем представлении в модель.
  • Во-вторых, используйте метод pluck вместо массива активных объектов записи. Строка массива является легкой, чем массив активной записи. Правильно ?
  • В-третьих, используйте шаблон для шаблонов вместо шаблонов.
  • Четвертый, кэш-дБ.
  • В Fiveth используйте плагин Google PageSpeed ​​для Google Chrome, чтобы анализировать то, что медленно.
1

Петр ответ правильный, и я добавлю две вещи:

жадная загрузка

Выполнение этого

current_user.questions.each do |question| 
    question.answers.each do |answer| 
    ... 
    end 
end 

генерирует запрос для каждого вопроса. Rails загрузит все вопросы, затем для каждого вопроса загрузите связанные ответы (1 запрос + 1 запрос для любого вопроса).

Если заменить первую строку на

current_user.questions.include(:answer).each do |question| 

Rails загрузят все вопросы, то все связанные с ними ответы (2 запросов).

Посмотрите на журнал

Каждый информации для любой плохой работы должен быть виден на бревнах в режиме разработки. Например, если voted_up необходимо загрузить любые другие модели, кроме answer, ваш номер запроса будет слишком большим.

Смежные вопросы