Ruby on rails 显示一个activerecord对象的多个副本
我正在显示文章列表,并使用will_paginate gem和无休止的滚动。这一切都很好 然而,我的问题是,我偶尔会在视图中看到同一篇文章的多个副本。这并不是一直都会发生,也不是每一篇文章都会发生,但已经足够让人讨厌了 我知道数据库中没有重复项,所以渲染时会出现问题 这是我的控制器:Ruby on rails 显示一个activerecord对象的多个副本,ruby-on-rails,ruby,activerecord,pg,Ruby On Rails,Ruby,Activerecord,Pg,我正在显示文章列表,并使用will_paginate gem和无休止的滚动。这一切都很好 然而,我的问题是,我偶尔会在视图中看到同一篇文章的多个副本。这并不是一直都会发生,也不是每一篇文章都会发生,但已经足够让人讨厌了 我知道数据库中没有重复项,所以渲染时会出现问题 这是我的控制器: @articles = Article.order("date_published DESC", "RANDOM()").paginate(:page => params[:page],:per_page =
@articles = Article.order("date_published DESC", "RANDOM()").paginate(:page => params[:page],:per_page => 10)
我试图以某种方式包括distinct或uniq方法,但似乎我不能将两者都用于order方法
我用pg来表示db
任何帮助都将不胜感激 您的子排序出现问题,
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,您需要找到另一种方法来实现该过滤器。停止对它们进行随机化?是的,这很有效。谢谢我没有意识到随机排序有这种效果。看看我的答案,当你执行这样的任务时,你应该真正考虑你的代码将要做什么。这将对结果产生什么影响。你为什么一开始就按“RANDOM()”排序?我按日期排序,然后每天随机排序。谢谢你的回复。