如何在从控制器返回之前在原始记录列表之前添加项目列表?

时间:2018-05-05 04:10:20

标签: ruby-on-rails ruby

如何在返回前添加记录列表

让我们说我有索引方法定义如下。索引视图要求@songs列出所有歌曲。

@top = TopChart.all

@songs = Song.order(created_at: :desc).page(params[:page]).per(20)

现在我想在@songs前面添加@top记录。例如@songs = @top + @songs。以这种方式更新列表后,分页也应该有效。我感谢任何帮助!谢谢!

1 个答案:

答案 0 :(得分:1)

即使在添加了一些额外记录之后,为了使分页工作,您必须在获取@songs时提供必要的偏移量。您还需要单独处理查询的第一页,其中显示@top的记录。 以下是示例代码:

page_size = 20
if params[:page] == 1
    @top = TopChart.all
    page_offset = 0
    per_page = page_size - @top.size
else
    @top = []
    page_offset = page_size - TopChart.all.count
    per_page = page_size
end

@songs = Song.offset(page_offset).order(created_at: :desc).page(params[:page]).per(per_page)
@songs = @top + @songs

在此代码中,如果我们返回第一页,则offset为0,但@songs的所需大小为20减去@top的大小。但是,在第一页之后,所需的@songs大小变为20,并且首页中提取的歌曲数量会有所偏移。

请注意,有一个假设: @top的大小小于页面大小(本例中为20)