Rails 3: Обновление counter_cache, только если опубликовано
-
27-10-2019 - |
Вопрос
Это сложный вопрос.
У меня есть проект с несколькими типами контента, такими как статья, обзор и т. Д. Каждый тип контента имеет комментарии, комментарии полиморфны, поскольку они могут принадлежать любому типу контента.
Я хочу поместить общую счетчик комментариев на всех моих страницах контента, чтобы показать, сколько их комментариев, и я внедрил встречный кеш для этого. (Что -то вроде @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 Метод через перезвонить.
Это больше усилий на вашей стороне, но я уверен, что этот подход будет работать.