그룹 + 신뢰도 조합으로 제목 자동화하는 모범 사례

아니요, 이전에 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가 예약 작업을 등록하지 않고 있습니다. 어쨌든 더 많이 수정하려고 할수록 더 혼란스러워집니다… 이것이 올바른 접근 방식인지 확신이 들지 않으며, 코딩을 잘 모르는 터라 구현하는 것이 매우 어렵게 느껴집니다. 더 나은 방법이 있을까요?