2013-09-21 3 views
0

У меня есть страницы, которые показывают на пользовательские статьи, разбор из RSSрендеринг обертонов каждый раз в каждом блоке

Есть три модели в моем приложении

class User < ActiveRecord::Base 
    has_many :channels 

    has_many :feed_articles, through: :channels 

    has_many :comments 
end 

class Channel < ActiveRecord::Base 
    has_many :user 

    has_many :feed_article 
end 

class FeedArticle < ActiveRecord::Base  
    belongs_to :channel 

    has_many :comments 
end 

Это контроллер:

def home 
    @articles = current_user.try(:feed_articles) 
    @comments = current_user.comments 
    end 

Этот файл служит для просмотра:

def take_comments_for(article) 
    @comments.select{|f| f["feed_article_id"] == article.id } 
end 

def what_article(article) 
    current_user.comments.build(feed_article_id: article.id) 
end 

И это мнение:

- if user_signed_in? 

    - @articles.each do |article| 

      = link_to "#{article.title}",article.link 

      = raw article.description 
     - if article.favourite? 

      = render :partial => "layouts/remove_from_favourite",:locals => { :article =>article } 
     - else 

      = render :partial => "layouts/add_to_favourite",:locals => { :article => article } 
     - if take_comments_for(article).any? 

      comments 
      - take_comments_for(article).each do |comment| 

       = comment.content 
     = render :partial => "layouts/add_comment",:locals => { :article => article } 

Я удалить HTML-теги для лучшего обзора.

И обертоны:

_add_to_favourite.html.haml (удалить одно и то же.)

= form_for article, remote: true do |f| 
    = f.hidden_field :favourite, :value => "true" 
    = f.submit "add to favorite", class: "btn btn-primary" 

_add_comment.html.haml:

= form_for what_article(article) do |f| 
    = f.text_area :content, :rows => 3, :class => "span6", :placeholder => 'Enter text.' 
    = f.hidden_field :feed_article_id 
    %br 
    = f.submit "add comment", class: "btn btn-primary" 

Если Я запускаю его, мои страницы загружаются с частичными отрезками каждый раз для каждой статьи, например:

Rendered layouts/_add_to_favourite.html.haml (1.9ms) 
    Rendered layouts/_add_comment.html.haml (91.7ms) 
    Rendered layouts/_add_to_favourite.html.haml (1.9ms) 
    Rendered layouts/_add_comment.html.haml (2.8ms) 
    Rendered layouts/_add_to_favourite.html.haml (2.1ms) 
    Rendered layouts/_add_comment.html.haml (2.6ms) 
    Rendered layouts/_add_to_favourite.html.haml (2.1ms) 
    Rendered layouts/_add_comment.html.haml (2.9ms) 
    Rendered layouts/_add_to_favourite.html.haml (1.7ms) 
    Rendered layouts/_add_comment.html.haml (2.6ms) 
    Rendered layouts/_remove_from_favourite.html.haml (2.0ms) 

И страница загружается так долго.

И если я добавлю частичные файлы в свой файл просмотра, все в порядке.

Объясните мне, пожалуйста, почему это рендеринг каждый раз (я полагаю, что он принимает переменные @comments от контроллера) и как я могу исправить эту проблему.

ответ

0

Это рендеринг каждый раз, потому что вы сказали ему делать именно это в каждом из ваших блоков. Это само по себе не нравится причина вашей проблемы.

Ваша проблема, скорее всего, вращается вокруг вашего «take_comments_for». Во-первых, вы вызываете его дважды, один раз для того, чтобы и когда-либо отображать его.

Во-вторых, как вы загружаете отношения, которые вы нажимаете на проблему n + 1. Вы должны настроить свои отношения и свои последующие запросы, чтобы вы охотно загружали комментарии и статьи. Это приведет к загрузке требуемых данных вперед в 2 вызовах вместо этого, если вы попадете в БД для каждого отдельного элемента в каждом блоке.

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