Rails / Elasticsearch
この記事はRuby on Rails Advent Calendar 2016の17日目です。
RailsでElasticsearchといえばelasticsearch-railsですね。
今回はelasticsearch-railsとkaminariを合わせて使う時に押さえておいた方が良いことをまとめてみました。
ただ、基本的にはドキュメントにも書いてあることなのでちゃんとドキュメントを読んでおいた方が良いです。
検索結果をArelオブジェクトとして扱うと順番が変わる
まず前準備として、これはドキュメントにも書いてあることなのですが
という結果を取得した時に
と、Arelオブジェクトとして評価してしまうと順番が維持されません。
ドキュメントにはto_a
を使うようにと書いてあるのでそうしましょう。
elasticsearch-railsとkaminariと合わせて使う
こちらもドキュメントに書いてあるのですが、elasticsearch-railsはkaminariやwill_paginateと合わせて使うことができます。
例えばこんな感じです
ここまでは特に問題ありません。
検索結果をArelオブジェクトとして扱う&kaminariと合わせて使う
検索結果をArelオブジェクトとして扱いたくて、さらにページングもやりたいという時は問題が起きます。
普通に書くと
となりますが、to_a
で返ってくるのはArray
オブジェクトなので、ページング情報が失われてしまいます。
この場合は少し面倒ですが、こんな感じにする必要があります。
ただ、これをそのままメソッド化してしまうとArel
オブジェクトのメソッドチェーンを自由にできないので、こんな感じにしておくと良いと思います。
使い方はこんな感じですね
まとめ
ドキュメントはちゃんと読みましょう。