Rails 在 Postgres 中使用子查询对查询进行分页
Rails Paginate Query with Subquery in Postgres
我有以下 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 分页。
但是,问题是要使查询正常工作,我必须将 LIMIT
和 OFFSET
添加到主查询和子查询中。
如果我直接这样修改:
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>
有什么想法或建议吗?
这可能看起来有点傻,但您是否尝试过在查询中的 .per
之前调用 .page
?所以 Post.where("...").order("...").page(1).per(100)
?
如果这不起作用,Kaminari 可以对数组进行分页。尝试使用 .to_a
将结果转换为数组,然后使用 paginate_array
辅助方法。
https://github.com/amatsuda/kaminari#paginating-a-generic-array-object
我有以下 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 分页。
但是,问题是要使查询正常工作,我必须将 LIMIT
和 OFFSET
添加到主查询和子查询中。
如果我直接这样修改:
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>
有什么想法或建议吗?
这可能看起来有点傻,但您是否尝试过在查询中的 .per
之前调用 .page
?所以 Post.where("...").order("...").page(1).per(100)
?
如果这不起作用,Kaminari 可以对数组进行分页。尝试使用 .to_a
将结果转换为数组,然后使用 paginate_array
辅助方法。
https://github.com/amatsuda/kaminari#paginating-a-generic-array-object