显示一个 activerecord 对象的多个副本

Displaying multiple copies of one activerecord object

我正在显示文章列表并使用 will_paginate gem 和无限滚动。这一切都很好。

但是,我的问题是我偶尔会在视图中看到同一篇文章的多个副本。它不会一直发生,也不会在每篇文章中发生,但足以令人讨厌。

我知道数据库中没有重复,所以问题出现在渲染中。

这是我的控制器:

@articles = Article.order("date_published DESC", "RANDOM()").paginate(:page => params[:page],:per_page => 10)  

我正在尝试以某种方式包括 distinct 或 uniq 方法,但似乎我不能将其中任何一个与 order 方法一起使用。

我正在为数据库使用 pg。

如有任何帮助,我们将不胜感激!

问题出在您的子排序上,RANDOM()

假设我有这些帖子:

id  published  title
----------------------
 1  1/1/1970   One
 2  1/2/1970   Two
 3  1/2/1970   Three
 4  1/3/1970   Four

如果我请求第一页(页面大小为 2),我可以得到 4 和 3,或者 4 和 2。现在,如果我请求第 2 页,我可以得到 3 和 1 或 2 和 1 . 这是因为 RANDOM() 子排序。第一个查询可能会从此结果中提取页面:

id  published  title
----------------------
 4  1/3/1970   Four
 3  1/2/1970   Three
 2  1/2/1970   Two
 1  1/1/1970   One

也就是4和3,不过这样的结果也是有可能的:

id  published  title
----------------------
 4  1/3/1970   Four
 2  1/2/1970   Two
 3  1/2/1970   Three
 1  1/1/1970   One

这是 4 和 2。这些结果中的任何一个也会导致不同的第 2 页。这种随机排序是造成重复的原因,您需要使用一致的排序或以其他方式管理重复项的删除。如:

@articles = Article.where.not(id: list_of_already_fetched_ids).order("date_published DESC", "RANDOM()").paginate(:page => params[:page],:per_page => 10)

注意: where.not 在 Rails 4 中可用,如果你不使用 Rails 4,你需要找到另一个实现该过滤器的方法。