ja ja ja de ja ja ja ja ja ja ru ja ja ja ja ja en ja ja de nl ja nb ja ja fr ja en ru ja ja en ja ja en ja ja ja ja zh ja ja ja ja ja ja ja ja ja ja cv es es ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja ja
Kaminari.paginate_array(array_from_find_by_sql).page(params[:page]).per(10)
Kaminari.paginate_arrayは読んで字のごとく、配列をkaminariで扱えるようにするためのメソッドです。これでとりあえず要件としては満たせますが、レコード件数が多くなってくるとパフォーマンスに問題が出てきます。このやり方だと、find_by_sqlが検索対象のActive Recordオブジェクトを毎回すべて生成する必要があるからです。例えば10000件のレコードが対象となるクエリだとしたら、毎回10000個のActive Recordオブジェクトが生成されるわけです、これはだいぶつらいですね…><。
kaminariで生成したモデルオブジェクトは、ビューでpaginateメソッドへの引数になり、ページネーション用のhtmlになります。引数は必ずしもkaminariから作成されたクラスである必要はなく、必要なメソッドが定義されていれば問題ありません。なので必要なメソッドを返すラッパーを用意すればよい、と考えてしばらく↓のようなクラスを作り運用していました(もちろんfind_by_sqlの引数としてlimitやoffsetを使ったクエリを組み立てる必要がありますし、total_countは別のクエリで取得しておく必要があります)。
しかし、そもそもKaminari.paginate_arrayに次のような形で引数を渡すと、無駄なActive Recordのオブジェクトを生成する必要なく、上記のWrapperForKaminariと同等のメソッドが提供されたオブジェクトが返る、ということに気づきました。
Kaminari.paginate_array(array_from_find_by_sql, limit: 10, offset: 0, total_count: 100)
WrapperForKaminariをgemにしようかな。と思っていたのですが不要でしたね。kaminariべんり。
*1:仮に追加できても、find_by_sqlで発行されるクエリをいじれないので無意味ですね…
willnet 2018-11-28 17:51
minitest で mock や stub を使う
minitest には標準で mock や stub の機能が付いています。それ…
ActiveRecord::QueryMethods#joins のメモ
Ruby on Rails Guides: Active Record Query Interface の join…
Rails 3.0 リリースノート和訳 - 後編
お待たせしました。後編です。一週間で書くつもりが一ヶ月かか…
the rspec book - Chapter 12 Spec::Example その1
The RSpec Bookを読んでの自分用メモです。サブアカの方にメモ…
Rails勉強会@東京第38回に参加した(その2)
Rails勉強会@東京第38回に参加した(その1)に続いてその2です。…
« turbolinksとform_withを便利に使うための… 現場で使えるRuby on Rails 5 速習実践ガ… »
id:willnet はてなブログPro
べんりで楽しいwebサービスをたくさん作りたい
読者です 読者をやめる 読者になる 読者になる
@netwillnetをフォロー
失敗したテストのログだけを出力するぞ
iCARE Dev Meetup #34で登壇しました
`Thread.current[:hoge]`はスレッドローカル変数を参照していると思いきや実際はファイバーローカル変数だった