הסיפור של היום הוא על Rails כי ריילס היא כמו פלסטלינה ומאפשרת לעצב את הפרויקט איך שרוצים, וכי קוד שאילתות בריילס יכול להיות מפוזר בין הרבה קבצים. אבל הסיפור הוא גם על AI ואיך כלי פיתוח מבוססי AI יכולים לעזור גם למפתחים עצלנים לכתוב קוד נכון יותר. וזאת גם הזדמנות טובה להזכיר שמחר בבוקר אני מעביר וובינר על עבודה עם כלי AI בפיתוח שמיועד למתחילים. אשמח לראות גם אתכם שם (הלינק יעלה לקבוצת טלגרם בחמישי בבוקר או שתשלחו לי מייל ואשלח לכם). עכשיו נחזור לריילס.
ב Rails בשביל לשלוף מידע מבסיס הנתונים אני משתמש בשכבת ORM שנקראת Active Record. לדוגמה ניקח שתי טבלאות, אחת של מוצרים ואחת של קטגוריות, ובטבלת המוצרים יש עמודת משקל. בדף הקטגוריה עלינו להציג את המוצרים מסודרים לפי משקל מהקטן לגדול.
אפשר לכתוב את הגדרת ה ORM בריילס באופן הבא:
class Category < ApplicationRecord
has_many :products
end
class Product < ApplicationRecord
belongs_to :category
# Default scope to always order products by weight
default_scope { order(:weight) }
end
ואז בקוד של העמוד נוכל להסתכל על רשימת המוצרים באופן הבא:
category = Category.first
category.products
והכל עובד ומוצג לפי הסדר הנכון. אז איפה פה הבעיה? עכשיו אם במקום אחר בקוד אני רוצה להציג את המוצרים בסדר הפוך אני כבר לא יכול סתם לשלוף אותם מבסיס הנתונים עם:
category.products.order(weight: :desc)
אלא צריך לבטל את ה order של הסקופ הדיפולטי קודם עם:
category.products.unscope(:order).order(weight: :desc)
בעצם ריילס אומר לנו - תבחרו, או שתקבלו את ה order בחינם בכל השאילתות ואז תצטרכו לעבוד קשה כשתרצו משהו עם order אחר, או שתצטרכו לכתוב עוד מילה של order בכל שאילתה שצריכה את המוצרים לפי סדר.
הבעיה כאן היא שבמערכת קיימת אפילו לא גדולה הרבה יותר קל להגדיר default scope ולקבל את ה order הנכון בכל המערכת במכה אחת מאשר להגדיר order על כל שאילתה, אבל הגדרה כזאת תהיה מבלבלת בעוד חודש (או כמה חודשים) כשנצטרך להוסיף שאילתה חדשה ולא נזכור את מיון ברירת המחדל.
ופה נכנס לתמונה החבר שלי קלוד: כי ברגע שאנחנו עובדים עם כלי פיתוח מבוססי AI ויודעים לנסח את האתגר והארכיטקטורה שאנחנו רוצים, לעדכן order על כל השאילתות בפרויקט נהיה קל כמו להוסיף default scope - ובצורה כזאת יש יותר מוטיבציה להגיע לקוד הנכון.