will_paginate“中断”查询结果

时间:2016-09-25 22:42:11

标签: ruby-on-rails-4 will-paginate

我有一个查询显示3566结果可以。 当我在其上使用paginate时,结果是18,但在控制台中我看到它运行的查询是好的

这是我的控制器

  def listcontractors
@listcons = Contract.paginate(:page => params[:page], :per_page => 50).joins(:contractor)


    .select("contractors.id,name,ico,city,country,count(resultinfo_id)")
              .group("contractors.id,name,ico,city,country")
              .order("name")
  end

这是我在控制台中看到的查询,当我把它放在psql中时结果还可以

  

(22.2ms)SELECT COUNT(*)AS count_all,   contractors.id,name,ico,city,country AS   contractors_id_name_ico_city_country来自“承包商”INNER JOIN   “合同”是“合同”。“contractor_id”=“承包商”。“id”GROUP   BY contractors.id,name,ico,city,country承包商负载(30.8ms)   SELECT contractors.id,name,ico,city,country,count(resultinfo_id)as   从“承包商”INNER JOIN“合同”开始计算   “contract”。“contractor_id”=“承包商”。“id”GROUP BY   contractors.id,name,ico,city,country ORDER BY名称限制50 OFFSET   1050

当我从查询中删除.paginate部分时,结果还可以 我的模特是

    class Contract < ActiveRecord::Base
  belongs_to :resultinfo
  belongs_to :contractor
end

class Contractor < ActiveRecord::Base
    has_many :contracts
end

我尝试将查询切换到Contractor.joins(:合约),但问题相同,分页结果远低于它应该是

知道为什么会这样吗? 感谢

2 个答案:

答案 0 :(得分:1)

感谢gmcnaughton我创建了这个解决方案

ids = Contractor.order("name").pluck(:id)
 @listcons = ids.paginate(:page => params[:page], :per_page => 50)
 @groupedcons = Contractor.joins(:contracts)
     .where(id: @listcons)
     .select("contractors.id,name,ico,city,country,count(resultinfo_id)")
     .group("contractors.id,name,ico,city,country")
     .order("name")

我不得不添加初始化程序需要&#39; will_paginate / array&#39;因为否则它会显示数组的未定义total_pages方法

答案 1 :(得分:0)

混合paginategroup非常棘手。 paginate在查询上设置OFFSET和LIMIT,它将应用于GROUP BY的结果 - 而不是限制将分组的记录。

如果您要对所有合同进行分页,请将每个页面分组50个结果(一次一页),试试这个:

def listcontractors
  # get one page of contract ids
  ids = Contract.paginate(:page => params[:page], :per_page => 50).pluck(:id)

  # group just the items in that page
  @listcons = Contract.where(id: ids)
                      .select("contractors.id,name,ico,city,country,count(resultinfo_id)")
                      .group("contractors.id,name,ico,city,country")
                      .order("name")
end

希望有所帮助!