Не уверен, что это идеальный вариант, но я использовал этот код, чтобы заменить содержимое постов пользователя в удалённых темах на "[deleted]". Таким образом, существование постов сохранялось, и это казалось безопаснее, чем полное их уничтожение.
# сначала сделана резервная копия
deleted_topic_id = 1234
user_id = 5678
t = Topic.unscoped.find(deleted_topic_id)
ps = t.posts.select { |p| p.user_id == user_id }
# `ps.count` для проверки
ps.each do |p|
p.raw = '[deleted]'
p.save
end