我有一个查询显示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(:合约),但问题相同,分页结果远低于它应该是
知道为什么会这样吗? 感谢
答案 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)
混合paginate
和group
非常棘手。 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
希望有所帮助!