显示一个 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,你需要找到另一个实现该过滤器的方法。
我正在显示文章列表并使用 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,你需要找到另一个实现该过滤器的方法。