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