在rails(500+)中渲染许多部分是很慢的

时间:2015-03-31 21:58:41

标签: html ruby-on-rails ruby haml

我使用artisttitledurationrelease等制作了歌曲模型的一部分。

我想在一个页面上显示所有艺术家的歌曲,有时他们有一吨。查询需要0.08秒,但我也看到了:

Rendered artist/_song_listing.html.haml (18.2ms)
Rendered artist/_song_listing.html.haml (8.5ms)
Rendered artist/_song_listing.html.haml (7.5ms)
Rendered artist/_song_listing.html.haml (9.6ms)
Rendered artist/_song_listing.html.haml (18.6ms)
Rendered artist/_song_listing.html.haml (12.6ms)
Rendered artist/_song_listing.html.haml (7.8ms)
Rendered artist/_song_listing.html.haml (19.5ms)

(等等)

最终这需要14秒,这太长了。

以这种方式使用partials是错误的吗?有没有办法让这更快?

编辑:

ArtistController:

  def show

    @artist = Artist.find(params[:id])
    @songs = @artist.songs.order('published_at DESC').includes(:members)

show.html.haml:

  .panel.panel-default
    - @artist.songs.each do |song|
      =render 'song_listing', song: song

_song_listing开始(约500次):

.row
  .col-xs-12
    .summary
      -if song.summary.present?
        ="#{song.summary.sanitize.strip.gsub("\u00A0"," ")}"
      -else
        %i
          No Summary

.row
  .col-xs-10
    %ul.list-inline
      - song.members.each do |member|
        %li
          %span
            %img{src:"#{member.image_url}", width: '20px', height: '20px', class: 'img-circle'}

3 个答案:

答案 0 :(得分:3)

负载是否来自SQL查询?尝试在控制器中预加载。

@songs = Song.all.includes(:artist,:title)

然后像

@songs.each do |song|
  # render logic here for each song
end

在包含中,您将放置任何未自动加载的相关关联。

如果SQL查询是您的问题,这应该使每个部分呈现更快。

从第一次查询中包含的进一步说明:

@artist = Artist.find(params[:id]).includes(:songs => [:members])
@songs = @artist.songs.order('published_at DESC')

我相信这会为你做到这一点。不过你之前的情况仍然可以。不确定是否需要“:成员”周围的括号,但基本上你要说的是,包括艺术家的歌曲,并且每首歌曲都包括它的成员。

答案 1 :(得分:1)

听起来你可能正在为每首歌进行数据库查找。尝试在单个查询中加载所有歌曲数据。如果确实渲染是瓶颈,也可能有助于发布您的视图代码。

答案 2 :(得分:1)

我知道已经有很多年了,但是我认为对当前答案的改进可能也会对其他人有所帮助

  .panel.panel-default
    =render partial: 'song_listing', collection: @artist.songs, as: :song

就渲染而言,这要快得多。速度不如内嵌渲染快,但比对每个项目进行渲染要好得多。