我将数据从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个月
答案 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_save
或before_save
回调以及DB中的某些空间来查询查询中的一些复杂性。你可以决定它是否是一个很好的权衡。