【问题标题】:will_paginate "breaks" query resultwill_paginate "breaks" 查询结果
【发布时间】:2016-09-25 22:42:10
【问题描述】:

我有一个查询显示 3566 个结果,一切正常。 当我对其使用分页时,结果为 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, 承包商.id,名称,ico,城市,国家 AS contractors_id_name_ico_city_country FROM "contractors" INNER JOIN “合同” ON “合同”。“contractor_id”=“承包商”。“id”组 BYcontracts.id,name,ico,city,country 承包商负载 (30.8ms) 选择contractors.id,name,ico,city,country,count(resultinfo_id) as count FROM "contractors" INNER JOIN "contracts" ON "contracts"."contractor_id" = "contractors"."id" GROUP BY Contracts.id,name,ico,city,country 按名称订购 LIMIT 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(:contract) 但问题相同,分页结果远低于应有的结果

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

【问题讨论】:

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


    【解决方案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")
    

    我不得不添加到初始化器需要'will_paginate/array',否则它会显示未定义的total_pages方法用于数组

    【讨论】:

      【解决方案2】:

      混合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
      

      希望有帮助!

      【讨论】:

      • 当我尝试这个时,我在控制台中看到查询正在 50ids 上运行我的组,但我收到一个错误 undefined method `total_pages' for #<:activerecord_relation:0x007f29806a5490>
      • 在这种情况下,您可能需要切换它:@listcons = Contract.paginate...@groupedcons = Contract.where(id: ids)... 然后在您的视图中,显示来自 @groupedcons.each(分组列表)的项目,但调用 will_paginate @listcons(分页列表)。
      • 谢谢,我不得不做的有点不同,但它终于可以工作了
      猜你喜欢
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 2023-03-10
      相关资源
      最近更新 更多