2015-03-31 21 views
3

我做了一個局部的一首歌曲模型artisttitledurationrelease呈現在軌許多諧音(500+)是慢

我想顯示一個頁面上所有的藝術家的歌曲,有時他們有一噸。查詢需要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秒,這是太長了。

以這種方式使用偏分量是否是錯誤的?有什麼辦法可以讓這個更快嗎?

編輯:

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 

Exerpt從_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

的是來來去去在SQL查詢?嘗試在你的控制器中預加載。

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

然後像

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

在包括你會把任何相關協會,這是不自動加載。

如果SQL查詢是您的問題,這應該使每個局部渲染速度更快。

了詳細的說明,包括從第一查找:

我相信這將做的伎倆爲您服務。然而,你之前所做的還是可以的。不知道是否需要「:members」的括號,但基本上你是說,包括藝術家的歌曲,每首歌曲都包括它的成員。

+0

我更新了問題。這是我如何使用包括?我甚至可以通過藝術家查詢做一個包含嗎? – Ashbury 2015-03-31 22:58:20

+0

@Ashbury你肯定是在正確的軌道上。查看您的Rails日誌以查看SQL查詢中的差異,如果您想查看究竟發生了什麼。 – 2015-03-31 23:12:50

1

這聽起來像你可能正在爲每首歌曲做數據庫查找。嘗試在單個查詢中加載所有歌曲數據。如果渲染確實是瓶頸,它也可能有助於發佈視圖代碼。

+0

謝謝你,我用一些額外的代碼更新了這個問題。 – Ashbury 2015-03-31 22:56:32