私はKaminariを使用して、別のレコードを選択しているクエリからいくつかの結果をページ付けしています。ActiveRecordを別名でカウントするように強制します。
@things = Thing.joins... # create a complex query that produces duplicate results
# I want to select distinct results: this produces the correct results
@things = @things.select("DISTINCT things.*")
# when Kaminari calls count, it will run "SELECT COUNT(*)", instead of
# "SELECT COUNT(DISTINCT things.*)" we will get the wrong count and extra pages
@things = @things.page(params[:page]).per(10)
私は雷の開発者によって拒否されたthis pull request、のように、count
に:distinct => true
を通過させることであると考えることができる最高の解決策:以下のコントローラのコードを考えてみましょう。 This SO questionは根本的な問題について論じている。 This line of codeはcount
の問題の呼び出しです。
カミナリにパッチを当てることなくカミンナリに正しいカウントを提供する回避策はありますか?ありがとう。
UPDATE:「カウント」と呼ばれるスコープを使用して
- は素晴らしい提案ですが、ActiveRecordは::関係に呼び出されたときに動作しません。私のモデルクラスで呼び出されたときに動作しますが、それは役に立ちません。
これはコメント以上のものですか? – apneadiving
はい、OPがモデル上のスコープを定義して名前を数えた場合、モデルからカウントを取得しようとするときにライブラリが行うことを制御できます。 – LeakyBucket
詳細を続けるとOKかもしれません。答えは明確になっているはずです。それ以外の場合は、ヒントをコメントとして入力します。 – apneadiving