2017-01-18 2 views
1

Модель книги has_many Оценки, имеющие overall атрибут.Rails - средний расчет родительского значения на основе детей

Я хочу, чтобы атрибут Bookmean_rating обновлялся каждый раз, когда рейтинг добавляется/уничтожается.

Что это самый простой способ сделать это?

+0

Использовать алгоритм. – zeantsoi

ответ

1

Самый простой способ (небезопасный) - использовать after_create/after_destroy обратные вызовы в модели Rating. См. documentation on model callbacks

Если вам нужно решение с потоковой безопасностью, вам нужно будет обновить mean_rating в отложенной работе или что-то в этом роде. This post может быть хорошим началом

2

вы можете использовать крючки жизненного цикла модели, примечание, after_create.

в модели оценки, вы можете написать после того, как создать крюк, который будет обновлять mean_rating

#models/rating.rb 

after_create :update_book_mean_rating 

def update_book_mean_rating 
    new_mean_rating = self.book.ratings.sum(:overall)/self.book.ratings.count 
    self.book.update_attributes(mean_rating: new_mean_rating 
end 

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

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