Уведомления
Очистить всё
Базы данных и Active Record
3
Сообщения
3
Пользователи
1
Реакции
677
Просмотры
19 сентября 2024 10:16
У постов comments_count через counter_cache: true, и на части постов число больше реального. Комментарии модераторы иногда чистят пачкой через delete_all, подозреваю, что дело в этом. Как пересчитать для всех и не устроить это заново? MySQL 8, Rails 7.1, постов около 200 тысяч.
2 ответа
19 сентября 2024 18:14
Да, 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
);
Я на старых проектах обычно делаю второе и вешаю раз в месяц проверку по крону, сколько постов расходятся.
20 сентября 2024 13:55
Ещё поищите update_column(:post_id, ...) или update_all при переносе комментариев между постами, это тоже идёт мимо счётчика.