不,我之前尝试过的 AI 代码也不起作用。设置好一切后,什么都没发生。
我想给你看看我最新尝试的完整代码。我希望你能发现我哪里做错了。
1. plugin.rb
# name: add-title-by-group-trust-level
# about: 使用 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
我在站点设置中的配置方式:
我将此 JSON 粘贴到 group_trust_level_titles 设置中:
{
"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 没有注册计划好的作业。无论如何,我尝试更改得越多,就越感到困惑……我不确定这是否是正确的方法,而且由于我不知道如何编码,所以感觉实现起来非常困难。你有没有更好的方法?