将使用命名范围对错误计算奇数进行分页

我最近将我的查询分解为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' 

像这样使用抛出最后的分页…

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

例如,Paginate将显示有6页,每页15页,但是当你到达第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子句,导致它返回更多结果…

有想法该怎么解决这个吗?

当使用group_by / having时 – 正如你在datem named_scope中所做的那样 – 不幸的是,ActiveRecord错误计数。 我认为你无能为力。 我也不确定这是否一定是ActiveRecord中的错误 – 或者只是根据生成的SQL的性质使用ActiveRecord时实际无法正确计算的错误。

无论哪种方式 – 您将需要解决这个’错误’。

执行此操作的方法是在单独的SQL语句(提供正确结果的语句)中处理计数,并将其添加到分页结果中,如下所示:

 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