Just because a popular open source app does it, does not imply this is a good practice. In general a good deal of business logic in the controller is a bad.
In this particular example, there is simply no good reason for having the logic of deducing watched count from the database in a controller - it should be a model method ( TopicUser.watched_count_in_category(category_id) ).
It is ideal if all the model operations are delegated to a service object, and controller's responsibility reduces to extracting params from the request and redirecting to appropriate target or rendering the appropriate template. This is simply because Rails does not provide very good mechanism to reuse controllers (shared concerns with business logic gets unwieldy pretty quickly), and controllers are by implementation coupled with HTTP.
It is very common, in practice, to move (or reuse) logic from HTTP request-reponse flow to background tasks or cron jobs. Such operations should be trivial and not require complex refactoring of codebase. This can obviously not happen if the business logic is coupled with HTTP context.