Nee, de vorige code die ik met een AI probeerde werkte ook niet. Nadat ik alles had ingesteld, gebeurde er helemaal niets.
Ik wilde je de volledige code van mijn laatste poging laten zien. Ik hoopte dat je misschien kon zien wat ik verkeerd doe.
1. plugin.rb
# name: add-title-by-group-trust-level
# about: assign titles via primary group + trust level using SQL
# version: 0.2
# authors: your-name
# Note: Ik weet niet zeker of ik hier een 'require'-regel nodig heb om het jobbestand te laden.
# Ik vermoed dat dit het ontbrekende stukje is.
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
Dit is hoe ik het heb geconfigureerd in de Site-instellingen:
Ik heb deze JSON in de group_trust_level_titles-instelling geplakt:
{
"designers": ["", "Junior Designer", "Designer", "Senior Designer", "Chief Designer"],
"developers": ["", "Junior Developer", "Developer", "Senior Developer", "Tech Lead"]
}
Het Probleem:
De UpdateTitles-job verschijnt niet in de Sidekiq-scheduler (/sidekiq/scheduler).
Ik heb het echter getest in de Rails-console volgens de methode die de AI me gaf, en de kernlogica is perfect in orde, waarbij alle gebruikers die aan de voorwaarden voldoen correct worden afgedrukt.
Dit is het testscript dat ik in de Rails-console heb gebruikt:
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 "Could not find group: #{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 "====== Group: #{group.name} Trust Level: #{tl} New Title: '#{title}' ======"
users.each do |user|
puts "User id:#{user.id}, username:#{user.username}, current title:'#{user.title}'"
end
end
end
Het lijkt er dus op dat de logica zelf correct is, maar Discourse de geplande taak niet registreert. Hoe dan ook, hoe meer ik probeer het te veranderen, hoe verwarrender het wordt… Ik weet niet zeker of dit de juiste aanpak is, en omdat ik niet weet hoe ik moet coderen, voelt het erg moeilijk om dit te implementeren. Heb je een betere methode?