模型关系问题

时间:2009-11-24 04:41:32

标签: ruby-on-rails data-modeling

我正在尝试根据以下模型关联来计算某个类别中所有条目的平均(平均)评级......

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查询?

3 个答案:

答案 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