No, the previous code I tried with an AI didn’t work either. After setting everything up, nothing happened at all.
I wanted to show you the full code from my latest attempt. I was hoping you might be able to see what I’m doing wrong.
1. plugin.rb
# name: add-title-by-group-trust-level
# about: assign titles via primary group + trust level using SQL
# version: 0.2
# authors: your-name
# Note: I'm not sure if I need a 'require' line here to load the job file.
# I suspect this might be the missing piece.
enabled_site_setting :add_title_by_group_trust_enabled
2. app/jobs/scheduled/update-all-titles.rb
module ::Jobs
  class UpdateTitles < ::Jobs::Scheduled
    every SiteSetting.update_title_frequency.hours
    def execute(args)
      return unless SiteSetting.add_title_by_group_trust_enabled
      mappings = JSON.parse(SiteSetting.group_trust_level_titles || '{}')
      User.transaction do
        mappings.each do |group_key, titles|
          next unless titles.is_a?(Array)
          (1...titles.size).each do |tl|
            title = titles[tl]
            next if title.blank?
            group = Group.find_by("LOWER(name) = ?", group_key.downcase)
            next unless group
            User.where(primary_group_id: group.id, trust_level: tl, admin: false, moderator: false)
                .where.not(title: title)
                .update_all(title: title)
          end
        end
      end
    end
  end
end
3. config/settings.yml
plugins:
  add_title_by_group_trust_enabled:
    default: false
    client: true
  group_trust_level_titles:
    default: '{"designers":["","Junior Designer","Designer","Senior Designer","Chief Designer"],"developers":["","Junior Developer","Developer","Senior Developer","Tech Lead"]}'
    type: string
    client: true
    multiline: true
  update_title_frequency:
    default: 24
    type: integer
Here’s how I configured it in the Site Settings:
I pasted this JSON into the group_trust_level_titles setting:
{
  "designers": ["", "Junior Designer", "Designer", "Senior Designer", "Chief Designer"],
  "developers": ["", "Junior Developer", "Developer", "Senior Developer", "Tech Lead"]
}
The Problem:
The UpdateTitles job doesn’t appear in the Sidekiq scheduler (/sidekiq/scheduler).
However, I tested it in the Rails console according to the method the AI gave me, and the core logic is perfectly fine, correctly printing out all the users who meet the conditions.
This is the test script I used in the Rails console:
mappings = JSON.parse(SiteSetting.group_trust_level_titles || '{}')
mappings.each do |group_key, titles|
  next unless titles.is_a?(Array)
  (1...titles.size).each do |tl|
    title = titles[tl]
    next if title.blank?
    group = Group.find_by("LOWER(name) = ?", group_key.downcase)
    unless group
      puts "Could not find group: #{group_key}"
      next
    end
    users = User.where(primary_group_id: group.id, trust_level: tl, admin: false, moderator: false)
                .where.not(title: title)
    next if users.empty?
    puts "====== Group: #{group.name} Trust Level: #{tl} New Title: '#{title}' ======"
    users.each do |user|
      puts "User id:#{user.id}, username:#{user.username}, current title:'#{user.title}'"
    end
  end
end
So it seems the logic itself is correct, but Discourse isn’t registering the scheduled job. Anyway, the more I try to change it, the more confusing it gets… I’m not sure if this is the right approach, and since I don’t know how to code, it feels very difficult to implement this. Do you have a better method?