グループと信頼レベルの組み合わせによるタイトル自動化のベストプラクティス

いいえ、以前試した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

# 注意: ジョブファイルをロードするために 'require' 行が必要かどうかはわかりません。
# これが欠けている部分であると疑っています。
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がスケジュールされたジョブを認識していないようです。いずれにせよ、変更を加えれば加えるほど、さらに混乱してきます。これが正しいアプローチなのかどうかわかりませんし、コーディング方法がわからないので、実装するのは非常に難しいと感じています。もっと良い方法はありますか?