如何使用Sequel :: Model对两个表进行分页?

时间:2011-10-30 16:46:23

标签: pagination sequel

对于更改,我使用的是Ramaze,因此使用基于Sequel的应用而不是Rails应用。

我有一个模型Tag,它通过连接表:posts:taggings相关联,并通过连接表{{1}与:external_posts相关联}}

我想一起收集这两个关联,并按日期字段排序,在每个表中称为:external_post_taggings

没有分页,我会这样做:

created_at

但是,我需要使用分页。如果它只是.posts我会这样做:

@combined = (@tag.posts + @tag.external_posts).sort_by(&:created_at).reverse

但我不知道如何对两个表进行分页,如果可能的话。

1 个答案:

答案 0 :(得分:4)

假设您想要对标签和帖子的组合进行分页,您可能希望对两个关联数据集的并集进行分页:

@tag.posts_dataset.
  union(@tag.external_posts_dataset).
  order(:created_at.desc).
  paginate(page, 10)

但是,除非posts和external_posts使用相同的模型类,否则这有问题。如果他们使用单独的模型类,您可能必须手动跟踪每个模型类的偏移量。基本上,对于每个页面,为两个关联选择接下来的10个记录(以适当的偏移量开始每个记录)。将2组10组合成一个数组,按反转的created_at字段对其进行排序,得到前10个结果。计算该10个组合/排序记录数组中的帖子和外部帖子的数量,并相应地更新帖子和外部帖子的偏移量,以便在下一页上使用。

例如,在第1页上,您将使用偏移量0。如果在组合,排序和前10个之后,10个数组中有7个帖子和3个外部帖子,在第2页上你将开始偏移7的帖子,外部帖子偏移3。