2012-01-21 2 views
0

Rails 3.1Rails: как усреднять несколько записей в базе данных после создания

Я упрощу свое приложение, чтобы ответить на мой вопрос.

У меня есть две таблицы: товары и обзоры

Items имеет столбец «AVERAGE_RATING» и обзоры имеет колонки «ITEM_ID» и «Рейтинг»

Для каждого элемента, я хотел бы хранить средний рейтинг для соответствующих обзоров. Хотя я не могу понять это, я чувствую, что я хочу сделать, это добавить что-то к созданию и методы обновления в обзорах контроллер по линиям:

@review = Review.find(params[:id]) 
@item = Item.find(@review.Item_ID) 

reviews_to_sum = Reviews.find_by_item_id(@item.id) 
@item.Average_Rating = reviews_to_sum.Rating.sum/reviews_to_sum.count 

Я признаю, однако, что выше вероятно, не близко к правильному ... Я новичок, и я застрял.

И я хочу сохранить Average_Rating в базе данных, а не вычислять его, когда мне это нужно, по целому ряду причин.

+0

Откуда вы получаете имена столбцов, такие как 'Item_ID'? ActiveRecord предпочитает 'item_id' по умолчанию и метод тот же. Капитализация в Ruby обычно относится к константам. – tadman

+0

Да, я использовал их, потому что я не думал, когда я изначально построил структуру базы данных. Я мог бы перенести все из них в нижний регистр, но капитляция действительно проблема или просто нестандартная? –

+0

Это просто будет выглядеть нерегулярно в настоящее время и в будущем, поэтому, чем скорее вы сможете приблизиться к стандартизации, тем лучше. У вас всегда должна быть веская причина идти против зерна. Это также означает, что вам не придется переопределять параметры внешнего ключа во всех отношениях. – tadman

ответ

3
class Item < ActiveRecord::Base 
    has_many :reviews 
end 

class Review < ActiveRecord::Base 
    belongs_to :item 

    after_save do 
    item.update_attributes average_rating: item.reviews.average(:rating) 
    end 
end 
+0

Ты гений. Меня никогда не перестает удивлять, насколько ясным может быть код рейдов, когда вы действительно знаете, что делаете. Я надеюсь когда-нибудь узнать, что я делаю! Еще раз спасибо! –

Смежные вопросы