아니요, 이전에 AI와 함께 시도했던 코드도 작동하지 않았습니다. 모든 설정을 마쳤는데도 아무 반응이 없었습니다.
가장 최근 시도에 사용한 전체 코드를 보여드리고 싶습니다. 어디서 잘못되고 있는지 확인해 주실 수 있으실지 기대하고 있습니다.
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: I'm not sure if I need a 'require' line here to load the job file.
# I suspect this might be the missing piece.
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
사이트 설정에서 구성한 방법:
group_trust_level_titles 설정에 이 JSON을 붙여넣었습니다:
{
"designers": ["", "Junior Designer", "Designer", "Senior Designer", "Chief Designer"],
"developers": ["", "Junior Developer", "Developer", "Senior Developer", "Tech Lead"]
}
문제점:
UpdateTitles 작업이 Sidekiq 스케줄러(/sidekiq/scheduler)에 표시되지 않습니다.
하지만 AI가 알려준 방법에 따라 Rails 콘솔에서 테스트해 보니, 핵심 로직은 완벽하게 정상 작동하며 조건에 맞는 모든 사용자를 올바르게 출력했습니다.
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 "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
즉, 로직 자체는 올바른 것 같지만 Discourse가 예약 작업을 등록하지 않고 있습니다. 어쨌든 더 많이 수정하려고 할수록 더 혼란스러워집니다… 이것이 올바른 접근 방식인지 확신이 들지 않으며, 코딩을 잘 모르는 터라 구현하는 것이 매우 어렵게 느껴집니다. 더 나은 방법이 있을까요?