【问题标题】:Rails Paginate Query with Subquery in PostgresRails 在 Postgres 中使用子查询分页查询
【发布时间】:2016-04-04 21:51:59
【问题描述】:

我有以下 Postgres 查询:

SELECT p.*
FROM   unnest('{19082, 19075, 20705, 18328, 19110, 24965, 18329, 27600
              , 17804, 20717, 27598, 27599}'::int[]) s(source_id)
     , LATERAL (
   SELECT *
   FROM   posts
   WHERE  source_id = s.source_id
   AND    deleted_at IS NULL
   ORDER  BY external_created_at DESC
   LIMIT  100
   OFFSET 0
   ) p
ORDER  BY p.external_created_at DESC
LIMIT  100
OFFSET 0;

我已将其转换为 ActiveRecord 查询,如下所示:

source_ids = '19082, 19075, 20705, 18328, 19110, 24965, 18329, 27600, 17804, 20717, 27598, 27599'
subquery = Post.where('source_id = s.source_id AND deleted_at IS NULL')
           .order('external_created_at DESC')
Post.select('p.*')
 .from("unnest('{#{source_ids}}'::int[]) s(source_id), LATERAL (#{subquery.to_sql}) p")
 .order('p.external_created_at DESC')

我想为此添加 Kaminari 分页。

但是,问题在于,要使查询正常工作,我必须将 LIMITOFFSET 添加到主查询和子查询中。

如果我只是这样修改它:

source_ids = '19082, 19075, 20705, 18328, 19110, 24965, 18329, 27600, 17804, 20717, 27598, 27599'
subquery = Post.where('source_id = s.source_id AND deleted_at IS NULL')
           .order('position, external_created_at DESC')
           .per(100).page(1)
Post.select('p.*')
 .from("unnest('{#{source_ids}}'::int[]) s(source_id), LATERAL (#{subquery.to_sql}) p")
 .order('p.position, p.external_created_at DESC')
 .per(100).page(1)

我收到undefined method 'per' for #<Post::ActiveRecord_Relation:0x007f9682f540e0>

有什么想法或建议吗?

【问题讨论】:

  • 您是否尝试将最后一行更改为 .page(1).per(100) ?请注意 github 页面,“请注意,每个范围不是直接在模型上定义的,而只是在页面范围上定义的方法”github.com/amatsuda/kaminari
  • @HeliosdeGuerra 是的,就是这样。对于一个愚蠢的错误来说,这是一个多么复杂的问题。

标签: ruby-on-rails postgresql ruby-on-rails-4 pagination kaminari


【解决方案1】:

这可能看起来有点傻,但是您是否尝试在查询中在.per 之前调用.page?那么Post.where("...").order("...").page(1).per(100)

如果这不起作用,Kaminari 可以对数组进行分页。尝试使用.to_a 将结果转换为数组,然后使用paginate_array 辅助方法。

https://github.com/amatsuda/kaminari#paginating-a-generic-array-object

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    相关资源
    最近更新 更多