counter_cache показ...
 
Уведомления
Очистить всё

counter_cache показывает 12 комментариев, а их 9

3 Сообщения
3 Пользователи
1 Реакции
677 Просмотры
Юлия Макарова
Сообщения: 8
Автор темы
Разобрался с блоками бэкенд-разработчица
Присоединился: 2 года назад
[#50]

У постов comments_count через counter_cache: true, и на части постов число больше реального. Комментарии модераторы иногда чистят пачкой через delete_all, подозреваю, что дело в этом. Как пересчитать для всех и не устроить это заново? MySQL 8, Rails 7.1, постов около 200 тысяч.


2 ответа
vova64
Сообщения: 23
Собрал свой gem фрилансер
Присоединился: 4 года назад

Да, delete_all колбэки не вызывает, и счётчик не уменьшается. Для пачек либо destroy_all небольшими выборками, либо после чистки пересчитывать. Пересчёт средствами Rails:

Post.find_each do |post|
  Post.reset_counters(post.id, :comments)
end

Это 200 тысяч запросов COUNT, ночью пройдёт. Одним запросом в MySQL:

UPDATE posts
SET comments_count = (
  SELECT COUNT(*) FROM comments
  WHERE comments.post_id = posts.id
);

Я на старых проектах обычно делаю второе и вешаю раз в месяц проверку по крону, сколько постов расходятся.


Ответ
kostya.sokurov
Сообщения: 73
Держит прод бэкенд-разработчик, senior
Присоединился: 4 года назад

Ещё поищите update_column(:post_id, ...) или update_all при переносе комментариев между постами, это тоже идёт мимо счётчика.


Ответ