2013-04-18 39 views
2

的計算。這是我的情景:ActiveRecord的屬性所依賴的其他模型

class User < ActiveRecord::Base 
    has_many :things 
    # attr_accessible :average_rating 
end 

class Thing < ActiveRecord::Base 
    belongs_to :user 

    has_one :thing_rating 
end 

class ThingRating < ActiveRecord::Base 
    belongs_to :thing 

    attr_accessible :rating 
end 

我想在我的用戶模型,有他的相關ThingsRating的平均值計算的屬性。

管理這個最好的做法是什麼?

感謝

回答

1

最簡單的辦法:

class User < ActiveRecord::Base 
    has_many :things 

    def avg_rating 
    @avg_rating ||= average(things.map(&:thing_rating)) 
    end 

    private 
    def average(values) 
    values.inject(0.0) { |sum, el| sum + el }/arr.size 
    end 
end 

這是罰款作爲首發。但是如果你有一點交通問題,你可能會發現自己有擴展問題。

然後,您必須重構此函數以避免每次調用其他用戶的方法時都要對這些內容進行SQL查詢。
然後,您可以有幾個possibilites:

  • 添加在您的用戶數據庫,avg_rating,這將由ThingRating它的創建或更新時,更新的領域。
  • 每次更新或創建ThingRating時,都使用memcached或redis數據庫來緩存值並使緩存失效。

當然,這些解決方案並不詳盡。你可以找到其他更適合你需求的東西。

+0

謝謝,我決定添加一個新的領域AVG_RATING以避免結垢問題。 –

2

可能是你可以使用關係不知道,但你可以試試這個

class User < ActiveRecord::Base 
    has_many :things 
    has_many :thing_ratings, through: :things 

    # attr_accessible :average_rating 

    def avg_rating 
    @avg_rating ||= thing_ratings.average("thing_ratings.rating") 
    end 
end 
相關問題