我正在显示文章列表并使用will_paginate gem和无休止的滚动。这一切都很好。
然而,我的问题是,我偶尔会在视图中获得同一篇文章的多个副本。它不会一直发生,也不会发生在每篇文章中,但足以让它变得令人讨厌。
我知道数据库中没有重复,因此在渲染中会出现问题。
这是我的控制器:
@articles = Article.order("date_published DESC", "RANDOM()").paginate(:page => params[:page],:per_page => 10)
我试图以某种方式包含distinct或uniq方法,但似乎我不能使用order方法。
我正在使用pg for db。
任何帮助将不胜感激!
答案 0 :(得分:0)
您的子排序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,则需要找到另一种方法来实现该过滤器。