gpt4 book ai didi

ruby-on-rails - 将使用命名范围对错误计数的奇怪进行分页

转载 作者:行者123 更新时间:2023-12-04 07:34:23 25 4
gpt4 key购买 nike

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

例如,分页将显示有 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/ifying 时 - 正如您在 datem named_scope 中所做的那样 - 不幸的是,ActiveRecord 的计数错误。我认为你对此无能为力。我也不确定这是否一定是 ActiveRecord 中的错误 - 或者只是在使用 ActiveRecord 时根据生成的 SQL 的性质实际上无法正确计算的事情。

无论哪种方式 - 您都需要解决这个“错误”。

这样做的方法是在单独的 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

关于ruby-on-rails - 将使用命名范围对错误计数的奇怪进行分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1465143/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com