Предположим, у меня есть приложение Rails, которое касается объектов Posts and Comment. A Post has_many
Комментарии и каждый Комментарий belongs_to
a Post.Использование методов помощников рельсов и контроллеров
В каждом комментарии имеется word_count
. Объект Post имеет свойство average_comment_word_count
, которое является средним значением каждого из комментариев word_count
.
Первый вопрос: если объект Post изменяется асинхронно (комментарии добавляются, что влияет на среднее число слов), в какой момент я должен пересчитать свойство? Когда объект возвращается? Или каждый раз, когда добавляется новый комментарий? Входит ли он в методы комментариев или почтовых помощников? Какая функция контроллера должна вызывать этот метод?
Также, когда я включаю следующий метод почтового помощника, я получаю значение NULL, возвращаемое как JSON.
def average_word_count
@average_word_count = 0
# current_user returns the current user object
# user has_many posts and each post belongs_to a user
current_user.posts.find(params[:id]).comments.each do |comment|
@average_word_count += comment.word_count/current_user.posts.find(params[:id]).comments.count
end
@average_word_count
end
Это делает много дополнительных запросов * и * он не учитывает асинхронных запросов. – coreyward
@coreyward, хорошая точка в асинхронных запросах, но я не вижу дополнительных запросов. Каждый post.comments.average (: foo) создает одно заявление sql. – Mori
Я считаю, что этот подход проще реализовать (и более общий), чем кеш-счетчик клиентов, поэтому я отмечаю его как принятый. –