Migliore pratica per automatizzare i titoli per combinazioni di gruppi e livelli di fiducia

No, anche il codice precedente che ho provato con un’IA non ha funzionato. Dopo aver configurato tutto, non è successo assolutamente nulla.

Volevo mostrarti il codice completo del mio ultimo tentativo. Speravo che potessi vedere cosa sto sbagliando.

1. plugin.rb

# name: add-title-by-group-trust-level
# about: assegna titoli tramite gruppo primario + livello di fiducia usando SQL
# version: 0.2
# authors: your-name

# Nota: non sono sicuro se ho bisogno di una riga 'require' qui per caricare il file del job.
# Sospetto che questo possa essere il pezzo mancante.
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

Ecco come l’ho configurato nelle Impostazioni del Sito:

Ho incollato questo JSON nell’impostazione group_trust_level_titles:

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

Il Problema:
Il job UpdateTitles non appare nello scheduler di Sidekiq (/sidekiq/scheduler).

Tuttavia, l’ho testato nella console Rails secondo il metodo fornito dall’IA e la logica principale funziona perfettamente, stampando correttamente tutti gli utenti che soddisfano le condizioni.

Questo è lo script di test che ho usato nella console 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 "Impossibile trovare il gruppo: #{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 "====== Gruppo: #{group.name} Livello di fiducia: #{tl} Nuovo titolo: '#{title}' ======"
    users.each do |user|
      puts "ID utente:#{user.id}, nome utente:#{user.username}, titolo attuale:'#{user.title}'"
    end
  end
end

Quindi sembra che la logica in sé sia corretta, ma Discourse non registra il job pianificato. Comunque, più cerco di cambiarlo, più diventa confuso… Non sono sicuro che questo sia l’approccio giusto e, dato che non so programmare, mi sembra molto difficile implementarlo. Hai un metodo migliore?