Mejor práctica para automatizar títulos por combinaciones de grupo y nivel de confianza

No, el código anterior que probé con una IA tampoco funcionó. Después de configurarlo todo, no pasó nada en absoluto.

Quería mostrarte el código completo de mi último intento. Esperaba que pudieras ver qué estoy haciendo mal.

1. plugin.rb

# name: add-title-by-group-trust-level
# about: asignar títulos por grupo principal + nivel de confianza usando SQL
# version: 0.2
# authors: tu-nombre

# Nota: No estoy seguro si necesito una línea 'require' aquí para cargar el archivo del trabajo.
# Sospecho que esta podría ser la pieza que falta.
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

Así es como lo configuré en la Configuración del Sitio:

Pegué este JSON en la configuración group_trust_level_titles:

{
  "designers": ["", "Junior Designer", "Designer", "Senior Designer", "Chief Designer"],
  "developers": ["", "Junior Developer", "Developer", "Senior Developer", "Tech Lead"]
}

El Problema:

El trabajo UpdateTitles no aparece en el programador de Sidekiq (/sidekiq/scheduler).

Sin embargo, lo probé en la consola de Rails según el método que me dio la IA, y la lógica principal está perfectamente bien, imprimiendo correctamente todos los usuarios que cumplen las condiciones.

Este es el script de prueba que usé en la consola de Rails:

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 "No se pudo encontrar el grupo: #{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 "====== Grupo: #{group.name} Nivel de Confianza: #{tl} Nuevo Título: '#{title}' ======"
    users.each do |user|
      puts "Usuario id:#{user.id}, nombre de usuario:#{user.username}, título actual:'#{user.title}'"
    end
  end
end

Así que parece que la lógica en sí es correcta, pero Discourse no está registrando el trabajo programado. De todos modos, cuanto más intento cambiarlo, más confuso se vuelve… No estoy seguro de si este es el enfoque correcto, y como no sé codificar, se siente muy difícil de implementar. ¿Tienes un método mejor?