# أفضل الممارسات لأتمتة العناوين حسب مجموعات + مستويات الثقة

**URL:** <https://meta.discourse.org/t/best-practice-for-automating-titles-by-group-trust-level-combinations/377324>\
**Category:** Development\
**Created:** [5 أغسطس 2025، 7:16ص UTC](https://meta.discourse.org/t/best-practice-for-automating-titles-by-group-trust-level-combinations/377324 "2025-08-05T07:16:33Z")\
**Posts on this page:** 1\
**Showing post:** 13

<div class="post-metadata">

**Author:** ![joo](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/joo/32/334852_2.png) [@joo](https://meta.discourse.org/u/joo)\
**Post date:** [9 أغسطس 2025، 10:08ص UTC](https://meta.discourse.org/t/best-practice-for-automating-titles-by-group-trust-level-combinations/377324/13 "2025-08-09T10:08:19Z")

</div>

لا، الكود السابق الذي جربته مع الذكاء الاصطناعي لم يعمل أيضًا. بعد إعداد كل شيء، لم يحدث شيء على الإطلاق.

أردت أن أريك الكود الكامل من محاولتي الأخيرة. كنت آمل أن تتمكن من رؤية ما أفعله بشكل خاطئ.

**1. `plugin.rb`**

```ruby
# 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`**

```ruby
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`**

```yaml
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`:

```json
{
  "designers": ["", "Junior Designer", "Designer", "Senior Designer", "Chief Designer"],
  "developers": ["", "Junior Developer", "Developer", "Senior Developer", "Tech Lead"]
}

```

* * *

**المشكلة:**  
لا يظهر مهمة `UpdateTitles` في مجدول Sidekiq (`/sidekiq/scheduler`).

ومع ذلك، اختبرتها في وحدة تحكم Rails وفقًا للطريقة التي قدمها الذكاء الاصطناعي، والمنطق الأساسي يعمل بشكل جيد، ويطبع بشكل صحيح جميع المستخدمين الذين يستوفون الشروط.

هذا هو نص الاختبار الذي استخدمته في وحدة تحكم Rails:

```ruby
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 لا يسجل المهمة المجدولة. على أي حال، كلما حاولت تغييره، زاد الأمر تعقيدًا… لست متأكدًا مما إذا كان هذا هو النهج الصحيح، وبما أنني لا أعرف كيفية البرمجة، يبدو الأمر صعبًا جدًا لتنفيذ هذا. هل لديك طريقة أفضل؟

---

_[View the full topic](https://meta.discourse.org/t/best-practice-for-automating-titles-by-group-trust-level-combinations/377324)._
