2017-02-04 73 views
1

我一直在努力嘗試開發一個類或範圍方法幾個小時,但有一個SQLite的初學者知識,我已經嘗試和閱讀的一切都失敗了。如何創建一個基於實例方法的值對對象進行排序的類/作用域方法?

我試圖找到一種方法,以他們的平均評級排序。

我有一個has_many/belongs_to List和Rating之間的關聯。列出have_many等級,每個列表可以擁有_many等級。然後我有一個計算列表的平均得分實例方法:

def average_rating 
    self.ratings.average(:rating).to_i 
end 

現在我試圖找到一種方法,命令由他們的平均等級名單,但我沒有任何成功。繼另一篇文章後,我嘗試了這種方法:

def self.highest_rating 
    List.all.sort_by(&:average_rating) 
end 

但它只是以特定順序返回所有列表。與此查詢:

SELECT AVG("ratings"."rating") FROM "ratings" WHERE "ratings"."rated_id" = ? 

我想過做AVERAGE_RATING名單上的模型的屬性,但有困難,甚至發展爲一個範圍的方法。如果您能提供任何建議或幫助,我將不勝感激!

回答

1

首先,您可以按任何列排序查詢結果而不是值。當您嘗試按平均評分進行分類時,現在您喜歡

List.all.sort_by(5) # you sort by result of the method which is simple number 

雖然這不是很有意義。

我相信你需要添加average_rating列到你的List模型。您將能夠計算平均得分爲每一個列表和值存儲在列,然後通過這樣的

def self.highest_rating 
    List.all.order(average_rating) 
end 

該列排序列表,以計算你的平均等級,你可能會回調每次你創建新的使用時間評分。它可能看起來像:

class Rating < ActiveRecord::Base 
    after_save :calculate_average 

    private 
    def calculate_average 
     #your code 
    end 
end 
+0

感謝您的幫助!我將添加您建議的屬性。 – Dog

相關問題