【问题标题】:Rendering many partials in rails (500+) is slow在 rails (500+) 中渲染许多部分很慢
【发布时间】:2015-03-31 21:58:41
【问题描述】:

我为 artisttitledurationrelease 等的歌曲模型制作了部分 a。

我想在一个页面上显示所有艺术家的歌曲,有时他们有很多。查询需要 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有错吗?有什么办法可以加快速度吗?

编辑:

艺术家控制器:

  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'}

【问题讨论】:

    标签: html ruby-on-rails ruby haml


    【解决方案1】:

    负载是否来自 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')
    

    我相信这会为您解决问题。但是,您之前所拥有的仍然可以。不确定“:members”周围的括号是否是必需的,但基本上你是说,包括艺术家的歌曲,并且每首歌曲都包括它的成员。

    【讨论】:

    • 我更新了问题。这就是我使用包含的方式吗?我什至可以更早地使用艺术家查找进行包含吗?
    • @Ashbury 你肯定走在正确的轨道上。如果您想确切了解发生了什么,请查看您的 Rails 日志以查看 SQL 查询的差异。
    【解决方案2】:

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

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

    这在渲染方面要快得多。不如内联渲染快,但比为每个项目进行渲染要好得多。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-23
        • 1970-01-01
        • 1970-01-01
        • 2014-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-27
        相关资源
        最近更新 更多