Updating topic count in categories after bulk delete & missing topics/posts

Thanks @pfaffman for the bulk deletion snippet you wrote using the Rails find_each method. Great work.

After bulk back-end deletion, is there a way to update the topic count in categories? Right now, I have an empty topic list which is ready for fresh import but the topic count in my categories still shows a count of thousands.And when I re-import fresh, the number only grows.

I waited overnight since I am not sure if there is a cron job or background task in Discourse that updates the counts. (I’m new to Discourse)

I feel like there is a command to refresh_topic_count or something…


I had a similar problem.

The following code (to be run within rails console) may solve your problem, make it worse, or set your hair on fire :fire:. Use at your own risk (and with a backup).

Category.all.each { |c|
    c.topic_count = c.topics.length - 1 # -1 for about post

Alternatively, rake import:ensure_consistency from here might help, but it seems to have destructive side effects.

Awesome, thanks @fefrei . Since I am new to Discourse and apparently did not completely read the docs I was not even aware that Sidekiq existed! :heart_eyes: Totally awesome. The solution was to simply trigger the Jobs::CategoryStats. No fire needed :fire_engine:.

[comment redacted (figured it out)]

1 Like

Now, I have a new problem which I don’t know how to feel about…

After import, I expected to have 2158 topics (or thereabout):

However, my new category count is around 1700. I checked the rails console to get (find_each) topics count where user not discobot and it confirms the new category topic count around 1700. Is there something I’m missing? Is there a log of “skipped topics” during import? I can’t seem to trace it out in the base.rb import include. Where does base.rb “puts” the error messages, exactly? Because it’s not in the ssh console.

What does Topic.count returns (when executed in the rails console)?

Sorry, I meant to say my topic count not category count. Trying to say my “topic count” showing next to my “category” label. The topic count returns 1691.


[I deleted my other replies in this topic, since they were the wrong path]

I happened to find this idea by @Simon_Cossar

This helped me to see that the Post.find_each method was not returning deleted posts. So when I went to re-import, my data it still existed. Now, before I re-import I run this for topics (and separately, posts):

require_relative '../discourse/config/environment'

cnt = 0
#Topic.find_each do |t| # only returns active topics
Topic.with_deleted.find_each do |t| # returns both active and deleted topics
  if t.id > 6 && t.user_id != -2 # excludes included system topics and Discobot user Greeting messages
    puts "Topic: #{t.id}, #{t.title}, #{t.user_id}"
        cnt = cnt +1
puts "Deleted #{cnt} active and deleted topics where t.id > 6 && t.user_id != -2"
1 Like