Enter!バッチを起動しようと勢いよくキーを叩いたら、それはシフトキーだった。itmammothTweetQiitaにも書いたのですが、ブログの方にも書いておこうと思います。ビュー内で部分テンプレート(パーシャル)を繰り返しrenderする場合、ちょっと気をつけておかねばならないことがあります。自戒の念を込めて、Qiitaに初投稿してみたいと思います。可能な限りrenderメソッドにはコレクションを渡しましょう。each等でぐるぐる回してrenderしても表示結果は変わりませんが、パフォーマンスは悪いです。%>なんとなくボーッとコーディングしてると、繰り返し?→じゃあeachじゃん、と条件反射的に書いちゃってる場合があります。どれぐらいパフォーマンスに差が出るのか、1,000件のpostsをそれぞれの方法でrenderしてみました。ms1,000件もパーシャルをrenderすることはそうそう無いですし、production環境だと劇的に遅くなるわけでもありません。development環境では差が結構出ますし、パフォーマンスは少しでも速いに越したことはありませんし、何よりrailsが用意してくれているベストな方法をチョイスしないのは罪です。コレクションを渡しましょう。上記例のようにコレクションの中身がActiveRecordモデルじゃない場合も、わざわざコレクションにして渡してあげた方がいいと思います。%>ちなみに、なぜパフォーマンスに差が出るのか少し調査してみたのですが、主にはパーシャルファイルを探して開く部分にあるようです(パーシャルファイルは1つなので、本来は1度しか実行しなくてよいところを、eachの場合は1,000回実行することになる)。developmentが遅いのはデバッグ情報の取得等々かな。:postsビューではfields_forメソッドを使用することができます。この時、fields_forで描画する内容をパーシャルにしたいことがあると思います。%>この場合は先程のケースのようにrenderにコレクションを渡すことができません。考えられる対応方法は・・・postsの件数(=fields_forでループされる件数)が大したことが無いのであれば気にしないバーシャルにしないといった感じでしょうか。諦めろっちゅうことです。そんな消極的なのは嫌だ!という人は、def_erb_methodを使用して、パーシャルビューの描画をerbメソッド化してしまうことができます。%>これでパーシャルを使用しない場合と同程度に高速化されます。上記の実装だと、開発中にposts/_post.html.erbの内容を変更しても、サーバを再起動するまでその変更が反映されません。汎用的かつサーバ再起動を不要とするために、以下のように実装してみました。erbメソッドを描画中のビューコンテキスト(=無名クラスのインスタンス)の特異クラスに定義するようにします。%>簡素な実装ですが、普段使いには問題なく動いています。railsをハックして高速renderをgem化してやろうかと思いましたが、rails特有の間口の広い引数対応が大変そうだったので、ハンカチを噛み締めながら撤退しました。いい方法があれば教えて下さい。返信をキャンセルメールアドレスが公開されることはありません。名前*メール*サイト上に表示された文字を入力してください。コメントデータの処理方法の詳細はこちらをご覧ください。検索:プロフィールitmammothIT界のマンモスを目指しているフリーエンジニアです。麻婆豆腐/Ruby/Kotlin/麻婆春雨/Python好きです。最近カリフラワーも好きになりました。