我正在尝试根据以下模型关联来计算某个类别中所有条目的平均(平均)评级......
class Entry < ActiveRecord::Base
acts_as_rateable
belongs_to :category
...
end
class Category < ActiveRecord::Base
has_many :entry
...
end
class Rating < ActiveRecord::Base
belongs_to :rateable, :polymorphic => true
...
end
评级模型由acts as rateable插件处理,因此应率模型看起来像这样......
module Rateable #:nodoc:
...
module ClassMethods
def acts_as_rateable
has_many :ratings, :as => :rateable, :dependent => :destroy
...
end
end
...
end
如何进行平均计算?这可以通过rails模型关联来实现,还是必须求助于SQL查询?
答案 0 :(得分:1)
average方法可能正是您所需要的。以下是在您的情况下如何使用它:
@category.entries.average('ratings.rating', :joins => :ratings)
答案 1 :(得分:0)
您可以在模型上使用named_scope或自定义方法吗?无论哪种方式它仍然需要一些SQL,因为如果我理解这个问题,你正在计算一个值。
在传统的数据库应用程序中,这将是数据表的视图。
因此,在这种情况下,您可能会做类似......(注意未经过测试或确定它是100%完成)
class Category
has_many :entry do
def avg_rating()
@entries = find :all
@entres.each do |en|
@value += en.rating
end
return @value / entries.count
end
end
答案 2 :(得分:0)
编辑 - 查看EmFi修改后的答案。
我不做任何承诺,但试试这个
class Category
def average_rating
Rating.average :rating,
:conditions => [ "type = ? AND entries.category_id = ?", "Entry", id ],
:join => "JOIN entries ON rateable_id = entries.id"
end
end