الخطافات والنطاقات
خصّص الاستعلامات
الخطافات والنطاقات درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
الخطافات والنطاقات
توفر GORM أداتين للتخصيص: تنفّذ الخطافات التعليمات البرمجية تلقائيًا حول أحداث دورة الحياة، وتجمع النطاقات منطق الاستعلامات القابل لإعادة الاستخدام. ويحافظ كلاهما على نظافة الوصول إلى البيانات واتساقه.
ما هي الخطافات؟
الخطافات هي أساليب في نموذجك تستدعيها GORM قبل العملية أو بعدها: BeforeCreate وAfterCreate وBeforeUpdate وBeforeDelete وغيرها.
خطاف BeforeCreate
عرّف أسلوبًا بالتوقيع الصحيح في النموذج. نضبط هنا UUID قبل إدراج السجل.
func (u *User) BeforeCreate(tx *gorm.DB) error {
u.UUID = uuid.NewString()
return nil
}التحقق في الخطافات
أعد خطأً من الخطاف لإلغاء العملية. وتجري GORM تراجعًا عن المعاملة المحيطة، ولذلك لا تصل البيانات غير الصالحة إلى قاعدة البيانات.
func (u *User) BeforeSave(tx *gorm.DB) error {
if u.Age < 0 {
return errors.New("age cannot be negative")
}
return nil
}تعمل الخطافات داخل معاملة
تمثل الوسيطة tx *gorm.DB المعاملة التي تستخدمها GORM. إذا كتبت بيانات مرتبطة داخل خطاف، فاستخدم tx هذه لكي تُثبّت أو يُتراجع عنها ذريًا مع العملية الأساسية.
ما هي النطاقات
النطاق هو دالة تستقبل وتُرجع كائنًا من النوع *gorm.DB، وتُغلّف جزءًا من استعلام. تُطبّقه باستخدام db.Scopes(...) وتعيد استخدامه في العديد من الاستعلامات.
func ActiveUsers(db *gorm.DB) *gorm.DB {
return db.Where("active = ?", true)
}تطبيق النطاقات
مرّر نطاقًا واحدًا أو أكثر إلى Scopes. تتكامل النطاقات معًا، ما يتيح لك دمج عوامل التصفية بصورة تصريحية لإنشاء الاستعلام النهائي.
db.Scopes(ActiveUsers, Recent).Find(&users)محاكاة خطاف قابل للتشغيل ونطاق
يحتاج GORM إلى قاعدة بيانات، لذلك يحاكي هذا المثال القابل للتشغيل خطاف BeforeCreate ونطاقًا شبيهًا بالنطاقات وقابلًا لإعادة الاستخدام، باستخدام دوال عادية.
package main
import (
"errors"
"fmt"
)
type User struct {
Name string
Age int
Active bool
}
func beforeCreate(u *User) error {
if u.Age < 0 {
return errors.New("age cannot be negative")
}
if u.Name == "" {
u.Name = "anonymous"
}
return nil
}
func activeOnly(users []User) []User {
var out []User
for _, u := range users {
if u.Active {
out = append(out, u)
}
}
return out
}
func main() {
u := User{Age: 30, Active: true}
if err := beforeCreate(&u); err != nil {
fmt.Println("error:", err)
return
}
fmt.Println("created:", u.Name)
all := []User{u, {Name: "Lin", Active: false}}
fmt.Println("active count:", len(activeOnly(all)))
}النطاقات لترقيم الصفحات
ينشئ أحد النطاقات الشائعة ترقيم الصفحات انطلاقًا من رقم الصفحة، ويغلّف Offset وLimit بحيث تستخدم كل نقطة نهاية للقوائم الطريقة نفسها في ترقيم الصفحات.
func Paginate(page, size int) func(*gorm.DB) *gorm.DB {
return func(db *gorm.DB) *gorm.DB {
return db.Offset((page - 1) * size).Limit(size)
}
}الخطافات مقابل منطق التطبيق
تُركّز الخطافات الاهتمامات المشتركة مثل الطوابع الزمنية والمعرّفات النصية وحقول التدقيق. احرص على إبقاء منطق الأعمال المعقد داخل الخدمات، لا الخطافات، حتى يظل السلوك قابلًا للتوقع والاختبار.
تجاوز الخطافات
في العمليات المجمعة، يمكنك تعطيل الخطافات باستخدام db.Session(&gorm.Session{SkipHooks: true}). يسرّع ذلك عمليات الاستيراد الكبيرة، لكنه يتجاوز عمليات التحقق لديك، لذا استخدمه بحذر.
تحقق سريع
اختبر معرفتك بالخطافات والنطاقات.
مراجعة
لقد تعلمت الخطافات والنطاقات:
- تعمل الخطافات حول أحداث دورة الحياة؛ ويؤدي إرجاع خطأ إلى إيقاف العملية والتراجع عن المعاملة
- تعمل الخطافات داخل المعاملة من خلال الوسيط tx
- النطاقات هي دوال *gorm.DB قابلة لإعادة الاستخدام، وتُطبّق باستخدام Scopes
- استخدم النطاقات لعوامل التصفية وترقيم الصفحات
- يتجاوز SkipHooks الخطافات في العمليات المجمعة
الأسئلة الشائعة
هل درس «الخطافات والنطاقات» مجاني؟
نعم — نص درس «الخطافات والنطاقات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «الخطافات والنطاقات»؟
خصّص الاستعلامات تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «الخطافات والنطاقات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- النماذج وAutoMigrate
- عمليات CRUD
- الارتباطات
- الخطافات والنطاقات