Rails - 随机记录但按日期保留订单

时间:2017-08-29 07:40:56

标签: ruby-on-rails ruby

我将数据从4个不同的来源提取到数据库中,当它们被保存时,它们会被铁路指定为created_at

当我显示数据时,我想首先显示最新的记录,所以我使用以下代码来获取created_at desc的记录,并在gem kaminari的帮助下通过分页显示记录

@stats = Stats.page(params[:page]).order('created_at desc').per(10)

我使用这种方法遇到的问题并非所有来源都获得相同的曝光率,例如,因为source A数据先被拉,然后source B数据在同一天被拉到第二天,在网站上将首先显示源A的记录,然后显示源B的所有记录。

所以我的问题是,如何按日期显示记录并随机化该日期的记录,以便所有来源都能获得相同的曝光率。是否有一个构建rails功能可以帮助这个?如果没有,那么实现我正在寻找的结果的最佳方法是什么?像这样的东西

Date (August 29th)
Record 1 -  (Belonging to Source A)
Record 2 -  (Belonging to Source E)
Record 3 -  (Belonging to Source D)
Record 4 -  (Belonging to Source B)
Record 5 -  (Belonging to Source E)
Record 6 -  (Belonging to Source D)
Record 7 -  (Belonging to Source A)



Date (August 28th)
Record 1 -  (Belonging to Source E)
Record 2 -  (Belonging to Source D)
Record 3 -  (Belonging to Source A)
Record 4 -  (Belonging to Source B)
Record 5 -  (Belonging to Source A)
Record 6 -  (Belonging to Source D)
Record 7 -  (Belonging to Source A)


...
...
...

这些记录显示过去6个月

1 个答案:

答案 0 :(得分:0)

如果您正在使用postgresql,您可以执行类似

的操作
Stats.select('*, random() as random')
  .order('date(created_at) ASC')
  .order('random ASC')

如果您为SQL提供了多个订单声明,它将使用第一列(在这种情况下created_at投放到日期)对数据进行排序,并且如果这些值中的任何一个是相同的(并且这是我们想要的,并且通过将created_at投射到日期而引起的)将使用第二个订单。

但是!每次刷新页面时 - 您都可以看到不同的结果,这是令人困惑的,非常糟糕的用户体验。

所以我建议添加一个新列(称为random)并在创建时分配随机数。然后你可以这样做:

Stats.order('date(created_at) ASC').order('random ASC')

最后一个问题是它不是DB不可知的(这个date函数可能在其他DBMS中不可用。)

要解决此问题 - 再添加一个名为created_on且列类型为date的列,请确保在保存时写下日期并且您可以继续:

Stats.order(created_on: :asc, random: :asc)

因此,正如您所看到的 - 您可以通过after_savebefore_save回调以及DB中的某些空间来查询查询中的一些复杂性。你可以决定它是否是一个很好的权衡。