Melhor Prática para Automatizar Títulos por Combinações de Grupo + Nível de Confiança

Só queria dar uma atualização e agradecer a todos que ajudaram.

Com as últimas alterações, o plugin agora está funcionando exatamente como eu pretendia! Ele atribui corretamente títulos diferentes com base no grupo principal e no nível de confiança do usuário.

Estou postando o código final de funcionamento abaixo. Parece estar correto, mas como não sou um desenvolvedor, estava me perguntando se há alguma área para melhoria ou otimização que eu possa ter perdido.

app/jobs/scheduled/update-all-titles.rb

# frozen_string_literal: true

module ::Jobs
  class AssignGroupBasedTitles < ::Jobs::Scheduled
    every SiteSetting.update_title_frequency.hours

    def execute(args)
      return unless SiteSetting.add_title_by_group_trust_enabled

      # Obtém o valor da configuração, que agora é uma string JSON
      rules_json_string = SiteSetting.group_based_title_rules
      return if rules_json_string.blank?

      begin
        # Esta é a correção mais crucial: analisar manualmente a string JSON em um array Ruby
        rules = JSON.parse(rules_json_string)
      rescue JSON::ParserError
        # Se o formato JSON estiver incorreto, saia diretamente para evitar falha na tarefa
        Rails.logger.error("Plugin Títulos Baseados em Grupo: Falha ao analisar JSON group_based_title_rules.")
        return
      end
      
      return unless rules.is_a?(Array) && rules.present?

      User.transaction do
        rules.each do |rule|
          group_id = rule["group_id"]
          trust_level = rule["trust_level"]
          title = rule["title"]

          next if group_id.blank? || trust_level.blank? || title.blank?

          User.where(primary_group_id: group_id, trust_level: trust_level)
              .where.not(title: title)
              .update_all(title: title)
        end
      end
    end
  end
end

config/settings.yml

plugins:
  add_title_by_group_trust_enabled:
    default: true
    client: true

  # Isso DEVE ser do tipo: objects. Esta foi a origem do erro.
  group_based_title_rules:
    type: objects
    default: []
    schema:
      properties:
        group_id:
          type: integer
          name: "Grupo de Usuários"
          component: "group-chooser"
        trust_level:
          type: integer
          name: "Nível de Confiança"
          min: 1
          max: 4
        title:
          type: string
          name: "Título"
  
  update_title_frequency:
    default: 24
    type: integer

plugin.rb

# frozen_string_literal: true

# name: add-title-by-group-trust-level
# about: Atribui títulos com base no grupo principal e nível de confiança.
# version: 2.1.0
# authors: Seu Nome

enabled_site_setting :add_title_by_group_trust_enabled

after_initialize do
  require_relative "./app/jobs/scheduled/update-all-titles.rb"
end
1 curtida