Rails 3: Обновление counter_cache, только если опубликовано

StackOverflow https://stackoverflow.com/questions/5852915

Вопрос

Это сложный вопрос.

У меня есть проект с несколькими типами контента, такими как статья, обзор и т. Д. Каждый тип контента имеет комментарии, комментарии полиморфны, поскольку они могут принадлежать любому типу контента.

Я хочу поместить общую счетчик комментариев на всех моих страницах контента, чтобы показать, сколько их комментариев, и я внедрил встречный кеш для этого. (Что -то вроде @article.comments.count - это больше запросов, и, поскольку я использую драгоценный камень предков для резьбовых комментариев, дочерние комментарии не учитываются в этом номере, только корневые.)

Контр -кэш прекрасно работает и показывает точное количество комментариев, но, как всегда, есть один маленький улов. Комментарии не всегда публикуются сразу, только зарегистрированные пользователи могут немедленно опубликовать, и эти комментарии имеют статус «2». Незарегистрированные пользователи попадают в очередь модерации; Эти комментарии имеют статус «1».

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

Есть ли способ добавить исключение в кеш -встречный, чтобы сказать, что он не увеличивает, если комментарий. Status не является «2»? Аналогичным образом, в бэкэнд в ресурсе комментариев и настройке этого комментария для публикации (предоставление статуса 2), есть ли способ тогда (модель, контроллер или иначе), чтобы сделать счетчик против его связанного полиморфного / типа контента?

Комментарии.rb

 # Comments
 has_many :comments, :as => :commentable, :dependent => :destroy
 accepts_nested_attributes_for :comments

Статья.rb

belongs_to :commentable, :polymorphic => TRUE, :touch => TRUE, :counter_cache => TRUE 
Это было полезно?

Решение

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

active_comments_count
pending_comments_count

Затем в вашей модели вы можете запустить update_comment_count Метод через перезвонить.

Это больше усилий на вашей стороне, но я уверен, что этот подход будет работать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top