かなり有名な話かと思うが、 jbuilderのpartialは遅い。 ActionViewの機能の render partial: '...' を内部的に呼び出しており、それが遅いからである。 そのため、数の多いレコードをjbuilderでレンダリングすると、だいたい数百msかかる。 # 内部でレコードごとにrender呼び出しているのが原因で遅い json.posts('posts/post', collection: @posts, as: :post)
実務では絶対に使わないけどrails/jbuilderのpartialレンダリングを無理矢理早くする方法。 partialでviewを使いまわしたい場合、特に1件のときはオブジェクト、複数件は配列を返したい場合、通常は以下のように書きます。 json.hoge do json.partial! 'api/hoge/record', collection: @records, as: :record end が、これはN+1 partial renderingが発生します。100件くらいの数値配列を出すだけでも遅いです。ログは以下のようにRenderedがたくさん表示されます。 ... Rendered api/hoge/_record.json.jbuilder (0.2ms) Rendered api/hoge/_record.json.jbuilder (0.1ms) Rendered
By: Wonderlane – CC BY 2.0[/caption] Rails4からJSONも標準でjbuilderを使ってテンプレートから出力できるようになった けど、しっくり来ないので簡単に比べてみた 以下の例はすべて次のようなJSONを返すテンプレート [{"title":"hello","price":100,"url":"http://192.168.1.19:3000/books/1.json"},{"title":"hello2","price":200,"url":"http://192.168.1.19:3000/books/2.json"}] [{"title":"hello","price":100,"url":"http://192.168.1.19:3000/books/1.json"},{"title":"hello2","price":200,"url"
こんにちは山田コーダーです。先日Rails Jbuilderのコードを読んでみたら存在自体を知らなかったメソッドを3つ発見しましたので、今日はそれらを紹介したいと思います。 ■その1:merge! Jbuilderテンプレート内ではextract!メソッドを利用して、ActiveRecordオブジェクトのattributesを簡単に列挙することができます。 ※Scaffoldで自動生成されるJbuilderテンプレートも以下のような感じですね! json.extract! @item, :id, :name, :number, :public, :created_at, :updated_atでもこれ、カラム数が多いテーブル全体を表示したい時はちょっと面倒じゃないでしょうか?行が長くなってRuboCop等の規約チェックツールに怒られますし、カラムの追加・削除の度にテンプレートの修正が必要に
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く