2009-11-24 3 views
0

Я пытаюсь вычислить среднее (среднее) рейтинг для всех записей в категории на основе следующих модельных ассоциаций ...Модель отношений Проблема

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 

Как я могу выполнить средний расчет? Можно ли это сделать с помощью ассоциаций моделей рельсов или мне нужно прибегнуть к SQL-запросу?

ответ

1

Метод average, вероятно, что вы ищете. Вот как это использовать в вашей ситуации:

@category.entries.average('ratings.rating', :joins => :ratings) 
+0

я глубоко осведомлен о среднем методе, но я не знаю, как примените его к этой ситуации. Мне интересно найти среднее (среднее) для всех записей в определенной категории. – crh

+0

Конечно! Отлично! Благодарю. Я начинал думать, что сошел с ума. – crh

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 
+0

, хотя, если вы получаете функцию AVG группы в SQL он уверен, будет быстрее – Don

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 
Смежные вопросы