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?