2017-09-25 58 views
1

我有rails動作,包括以下HAML部分:如何加速呈現帶有表單元素的rails_partial?

- @items.each_with_index do |item, i| 
    - item_no = 'item' + item.item_no.to_s 
    .item 
    = form_for item, remote: true, html: { multipart: true, autocomplete: 'off' } do |f| 
     = f.hidden_field :parent_id, :value => @parent.id 
     = f.hidden_field :image, value: item.image 
     ... 
     ... 
     // 5-6 attributes 

    - if @parent.has_item_numbers? 
     .serial-number{ class: ('right' if item.item_no.odd?) } 
     = item.item_no 

與其相關聯parent可以大大改變,並且可高達2000-3000以及根據用戶的items數目。我們對父母可以擁有的孩子數量沒有限制。在我決定limit:之前,有沒有辦法加速渲染.each_with_index方法,因爲現在這需要10秒鐘才能在本地完成請求。

速度有一些converting a partial to a method/block的討論,但我不完全理解它。

此外,值得注意的是,這個相同的部分在rails 5.0.4表現更好,但它已經大大減緩與rails 5.1.4

回答

1

您通常不應該在您的視圖中迭代。相反,你應該使用collection rendering將在另外進行迭代你,是known to be faster到讓你實現片段緩存:

您的看法:

= render @items, parent: @parent 

你的部分(即_item.html.haml):

- item_no = 'item' + item.item_no.to_s 
.item 
    = form_for item, remote: true, html: { multipart: true, autocomplete: 'off' } do |f| 
    = f.hidden_field :parent_id, :value => @parent.id 
    = f.hidden_field :image, value: item.image 
    ... 
    ... 
    // 5-6 attributes 

    - if parent.has_item_numbers? 
    .serial-number{ class: ('right' if item.item_no.odd?) } 
     = item.item_no 
+0

這使得美洲獅服務器完全掛在本地,每次我打開一個大集合的視圖。仍在挖掘...... brb。 – marvindanig

+0

答案的第三行應該是' - if @ parent.has_item_numbers?'。時間現在在2.5-3.5秒的範圍內。現在看看片段緩存:http://guides.rubyonrails.org/caching_with_rails.html – marvindanig

+1

@marvindanig我明確地在'render'調用中傳遞'parent',通常最好不要引用像'@ @ parent'。你應該明確注入你的依賴關係。 – meagar