4

私は最近、クエリを 4 つの名前付きスコープに分割して、再並べ替えを容易にし、それ以外の場合は常に正常に機能していたページ番号を付けますが、現在はページ数の計算に問題があります。

  named_scope :loc, lambda { |id| { :conditions => ['location_id = ?', id ] } }
  named_scope :datem, lambda { |*args| { :joins => :scannables, :conditions => [ "scannables.bookdate BETWEEN ? and ?", (args[0].to_date || 3.days.from_now), (args[0].to_date+(args[1] || 3)) ], :group => 'scannables.hostel_id', :having => 'SUM(scannables.available) > ' + ((args[1] || 3).to_i-1).to_s } }
  named_scope :order_by_external_desc, :include => :external_ratings, :order => 'SUM(scannables.available) DESC, external_ratings.rating DESC'
  named_scope :order_by_external_asc, :include => :external_ratings, :order => 'SUM(scannables.available) DESC, external_ratings.rating ASC'

最後に paginate をスローして、そのように使用します...

@location = Place.loc(params[:id]).datem(user_cart.getDate,user_cart.getDays).order_by_external_desc.paginate(:per_page => 15, :page => params[:page])

たとえば、Paginate は、それぞれ 15 の 6 ページがあることを示しますが、4 ページに到達すると、5 ~ 6 ページが消えます...そして、5 または 6 に直接ジャンプしようとすると、それらは存在しません。

それを見て、私はページネーションが持っている問題に気づきました

c=@location = Place.loc(params[:id]).datem(user_cart.getDate,user_cart.getDays).order_by_external_desc.size

c = 78

でも

c=@location = Place.loc(params[:id]).datem(user_cart.getDate,user_cart.getDays).order_by_external_desc

c.size = 56

前者のために生成されるSQLは、後者よりも約8行短く、より多くの結果を返す原因となる私のSQL HAVING句を無視しています...

これを修正する方法についてのアイデアはありますか?

4

1 に答える 1

0

group_by/having を使用すると、datem named_scope で行うように、ActiveRecord は残念ながらカウントを間違えます。それについてあなたができることはあまりないと思います。また、これが必ずしも ActiveRecord のバグなのか、それとも生成された SQL の性質上、ActiveRecord を使用するときに実際に正しく計算できないものなのか、私にはわかりません。

いずれにしても、この「バグ」を回避する必要があります。

これを行う方法は、別の SQL ステートメント (正しい結果が得られるもの) でカウントに取り組み、次のように paginate の結果に追加することです。

total_entries = Place.count(sql) # or the combinations of named_scopes etc with a .size or whichever one gives you the correct count

Place.scopes.paginate(:per_page => 15, :page => params[:page], :total_entries => total_entries) # where scopes are all of your named scopes as you have in your examples
于 2012-04-17T09:15:02.403 に答える