2017-08-29 63 views
0

我将数据从4个不同来源提取到数据库中,当它们保存时,它们将通过导轨分配到created_atRails - Randomise记录,但按日期保留订单

当我显示数据时,我想先显示最新的记录,所以我使用下面的代码来获取记录created_at desc和借助宝石kaminari记录通过分页显示。

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

我用这种方法所面临的问题是,不是所有的来源获取,例如等于曝光以来source A数据得到了拉出第一,然后source B数据得到了在同一天第二拉升,在网站上源A的所有记录将首先显示,然后将显示源B的所有记录。

所以我的问题是,我怎样才能按日期显示记录,并随机化该日期的记录,所以所有的来源可以得到相同的曝光。有没有一个可以帮助解决这个问题的构建栏功能?如果不是,那么实现我所期望的结果的最佳方式是什么?事情是这样的

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

由于记录数量相对较少,因此可以使用['Array#shuffle'](https://ruby-doc.org/core/Array.html#method-i-shuffle)。 – mudasobwa

+0

不会按日期打破订单吗?每个源有超过20条记录,涉及4个源,数据每天提取,最近6个月显示,因此数据非常庞大。 – Saadia

+0

无法对来自不同来源的数据进行奇迹分类。如果你想保存一个日期/时间顺序,把所有东西加入到一个数组中,并使用['Array#sort'](https://ruby-doc.org/core/Array.html#method-i-sort)。 – mudasobwa

回答

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_ondate类型,请确保你写上保存日期,你是好去:

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

所以,你可以看到 - 你可以使用after_savebefore_save回调以及数据库中的一些空间来交易查询中的一些复杂性。你可以决定这是否是一个好的折衷。