counter_cache в Rails в ассоциации с заданной областью

У меня есть User модель, которая has_many :notifications. Notification имеет логический столбец seen и область действия :unseen, которая возвращает все уведомления, где seen равно false.

class User < ApplicationRecord
  has_many :notifications
  has_many :unseen_notifications, -> { unseen }, class_name: "Notification"
end

Я знаю, что могу кэшировать количество уведомлений, если добавлю столбец с именем notifications_count в users и добавлю counter_cache: true к моему вызову belongs_to в Notification.

Но что, если я хочу кэшировать количество непросмотренных уведомлений пользователя? т.е. кэш unseen_notifications.size вместо notifications.size? Есть ли встроенный способ сделать это с помощью counter_cache или мне нужно использовать собственное решение?


person GMA    schedule 04.05.2016    source источник
comment
Насколько я знаю, нет встроенного способа сделать это. Но вы можете попробовать гем counter_culture. Это может соответствовать вашим потребностям   -  person Van Huy    schedule 04.05.2016


Ответы (1)


Согласно этой записи в блоге, нет встроенного способа использования кешей счетчиков для ассоциаций с ограниченной областью действия:

Обратные вызовы кэша счетчиков ActiveRecord срабатывают только при создании или уничтожении записей, поэтому добавление кэша счетчиков в ассоциации с ограниченной областью не сработает. Для сложных случаев, например подсчета количества опубликованных ответов, ознакомьтесь с counter_culture драгоценный камень.

Помимо использования внешнего гема, вы можете свернуть свое собственное решение, добавив обратные вызовы в свою модель Notification и добавив целочисленный столбец (например, unseen_notifications_count) в модель User:

# Notification.rb
after_save    :update_counter_cache
after_destroy :update_counter_cache

def update_counter_cache
  self.user.unseen_notifications_count = self.user.unseen_notifications.size
  self.user.save
end

Также см. ответы на Counter Cache для столбца с условиями? для дополнительные примеры реализации этого подхода.

person Dave Powers    schedule 19.12.2019