2013-05-15 37 views
0

我有一個〜10,000個應用程序的列表,我想按某些列排序,但是我想給某些列的「重量」比別人多。按加權變量排序結果?

例如,每個應用程序有overall_ratingscurrent_ratings。如果該應用有很多overall_ratings,那麼價值1.5,但是current_ratings的數量值得說2,因爲current_ratings表示該應用處於活動狀態並且當前很受歡迎。

現在可能有4-6個我想考慮的變量。

那麼,我該如何解決這個問題呢?在查詢本身?事實上只使用Ruby(請記住,這裏有超過10,000行需要在這裏處理)?還有別的嗎?

這是一個Rails 3.2應用程序。

+0

SQL數據庫並不是這裏工作的最佳工具。將elasticsearch引入到你的堆棧中,你是黃金。 – BroiSatse

回答

1

在普通的Ruby中排序10000個對象似乎不是一個好主意,特別是如果你只想要前10個左右。

您可以嘗試將您的數學公式放入查詢中(使用活動記錄中的訂單方法)。

但是,我最喜歡的方法是創建一個float屬性來存儲分數並使用before_save方法更新該值。

我會閱讀有關髒屬性的內容,因此只有在您更新某些條件時才執行此評分。

您也可以創建一個rake任務,重新評分當前對象。

通過這種方式,您可以在Ruby中保持評分功能(您可以輕鬆測試),並且可以向float屬性添加索引,以便數據庫查詢具有更好的性能。

+0

+1用於保持運行分數,但如果它需要「按曲線分級」,則需要更多的努力。 –

0

的嘗試是讓DB做這個工作,你有像一些查詢:(不能真正檢驗它,因爲色澱數據庫架構的):

ActiveRecord::Base.connection.execute("SELECT *, 
             (2*(SELECT COUNT(*) FROM overall_ratings 
             WHERE app_id = a.id) + 
              1.5*(SELECT COUNT(*) FROM current_ratings 
             WHERE app_id = a.id) 
             AS rating FROM apps a 
             WHERE true HAVING rating > 3 ORDER BY rating desc") 

理念是總結評分數量找到每個當前和整體評級與子查詢爲特定的應用程序ID和加權他們根據需要。