2017-02-04 5 views
1

私はクラスやスコープメソッドを開発しようと何時間も苦労してきましたが、初心者がSQLiteを知っています。インスタンスメソッドの値に基づいてオブジェクトを順序付けるクラス/スコープメソッドを作成する方法は?

平均的な評価でリストを注文する方法を見つけようとしています。

私はリストと評価の間にhas_many/belongs_toの関係を持っています。リストhave_many評価、各リストhave_many評価することができます。私は今、それらの平均格付けでリストを注文する方法を見つけようとしているが、任意の成功を持っていないです

def average_rating 
    self.ratings.average(:rating).to_i 
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 

それは大した意味ではありません。

Listモデルにaverage_ratingの列を追加する必要があると思います。あなたは新しいを作成しているたびにコールバックすべてのリストの平均採点を計算し、列にその値を格納し、あなたが使用することができますあなたの平均評価を計算するには、この

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

関連する問題