Массово закрыть существующие темы старше x?

Привет,

Я перенёс форум с XenForo на Discourse, и теперь есть много старых тем, которые я хотел бы закрыть. Есть ли способ закрыть все темы старше x месяцев? Я уже настроил это в категории, но это работает только для новых тем.

Вы можете попробовать использовать эту настройку в настройках категории:

Не уверен, закроет ли это старые темы, но попробовать стоит.

Другой вариант — использовать расширенный фильтр и установить дату «до»:

Затем вы можете применить массовые действия к появившимся темам.

Вы можете закрывать темы массово, используя Performing bulk actions as a moderator
Однако в зависимости от количества тем, которые вы хотите закрыть, возможно, лучше выбрать Administrative Bulk Operations.

Да, должно быть что-то подобное, связанное. Как мне сузить поиск до одной категории?

Вы можете найти ID категории и использовать его как дополнительное условие в команде. Например, закрыть все открытые темы в категории «general», созданные до 24 сентября:

cat_id = Category.find_by_slug('general').id
Topic.where(closed: false).where("created_at < '2024-09-24'").where(category_id: cat_id).find_each do |topic|
  topic.update_status('closed', true, Discourse.system_user)
end

Такие операции всегда немного волнуют. Обязательно создайте резервную копию базы данных перед их выполнением на случай непредвиденных ситуаций. Также разумно будет провести предварительную проверку, чтобы убедиться, что вы работаете с нужными данными. Один из способов — вывести count тем, к которым будет применена операция. Например:

Topic.where(closed: false).where("created_at < '2024-09-24'").where(category_id: cat_id).count