לא, גם הקוד הקודם שניסיתי עם בינה מלאכותית לא עבד. לאחר שהגדרתי הכל, שום דבר לא קרה כלל.
רציתי להראות לך את הקוד המלא מהניסיון האחרון שלי. קיוויתי שאולי תוכל לראות מה אני עושה לא בסדר.
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
כך הגדרתי את זה בהגדרות האתר:
הדבקתי את ה-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).
עם זאת, בדקתי את זה בקונסולת 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 לא מזהה את המשימה המתוזמנת. בכל מקרה, ככל שאני מנסה לשנות את זה, זה נהיה יותר ויותר מבלבל… אני לא בטוח אם זו הגישה הנכונה, ומכיוון שאני לא יודע לקודד, זה מרגיש קשה מאוד ליישם את זה. יש לך שיטה טובה יותר?