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

时间:2015-03-20 19:31:41

标签: ruby-on-rails ruby activerecord pg

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

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

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

这是我的控制器:

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

我试图以某种方式包含distinct或uniq方法,但似乎我不能使用order方法。

我正在使用pg for db。

任何帮助将不胜感激!

1 个答案:

答案 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,则需要找到另一种方法来实现该过滤器。

相关问题