2017-08-29 54 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回調以及數據庫中的一些空間來交易查詢中的一些複雜性。你可以決定這是否是一個好的折衷。