2017-09-25 16 views
1

は私が部分的に以下のHAMLが含まrails作用を有する:フォーム要素を使って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 

大きく異なりますし、同様に、ユーザーに応じて2000から3000まで行くことができ、そのparentに関連した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

これは、大規模なコレクションを含むビューを開くたびに、pumaサーバーを私のローカルに完全にハングします。まだ掘って... brb。 – marvindanig

+0

最後の3行目は ' - if @ parent.has_item_numbers? 'です。時間は今や2.5〜3.5秒の範囲にある。フラグメントキャッシングを見てみましょう:http://guides.rubyonrails.org/caching_with_rails.html – marvindanig

+1

@marvindanig 'render'コールで' parent'を明示的に渡しますが、部分的には '@親。依存関係を明示的に注入する必要があります。 – meagar

関連する問題