استعلامات ActiveRecord وأنت: كيفية العثور على () الطريقة الصحيحة للمهمة

تصوير وكالة أولويب على Unsplash

إذا كنت مثلي ، فستكون تجربتك عند التعرف على قواعد البيانات لأول مرة كمبرمج جديد شيئًا من تجربة مدهشة. فجأة ، تم عرض الأعمال الداخلية المعقدة للإنترنت أمامك - إنها طاولات وجمعيات على طول الطريق.

إذا كنت مثلي أيضًا عندما يتعلق الأمر بتعلم SQL وكيفية التفاعل فعليًا مع قواعد البيانات هذه ، فمن المحتمل أن تكون هناك تجاربك الأولى على الأرجح من مكالمة إيقاظ وقحة من خيارك المستحث سابقًا. فجأة تدرك أنه لكل قاعدة بيانات تخزن كميات هائلة من المعلومات ، يجب أن يكون هناك شخص يعرف كيف يجادل الشيء الرهيب لإخراج تلك المعلومات منه. وربما أدركت أن شخصًا معينًا سيكون أنت ، عاجلاً أم آجلاً.

لحسن الحظ ، أعطتنا أطر البرمجة الحديثة طرقًا مريحة وبديهية لإنشاء البيانات وتخزينها واستردادها. اليوم ، سنتحدث عن إطار واحد محدد - Ruby on Rails - وجانب معين منه يجعل إدارة قاعدة البيانات في غاية السهولة - ActiveRecord.

تم توثيق Rails و ActiveRecord جيدًا عبر الإنترنت ، لذلك سأترك تحليلًا أعمق لهم لأشخاص آخرين أكثر حكمة في الوقت الحالي. اليوم سوف أتطرق إلى جانب واحد على وجه الخصوص الذي عرقلني عند تعلم إطار العمل لأول مرة ، حتى يتجنب الطلاب الآخرون نفس المزالق: استعلامات قاعدة البيانات.

في تطبيق Rails ، تجمع جميع نماذجك ووحدات التحكم ووجهات النظر للقيام بعمل ممتاز لحفظ الأشياء في قاعدة البيانات الخاصة بك ، ولكن في نهاية المطاف سيكون عليك سحب تلك المثيلات من المعلومات مرة أخرى للقيام ببعض المنطق عليها ، أو ببساطة لإظهارهم. وذلك عندما تبدأ الاستفسارات في اللعب. الاستعلامات الموجودة في ActiveRecord هي في الأساس أوامر SQL ملفوفة داخل بطانية دافئة من بناء Ruby القابل للقراءة والكتابة ، مما يسمح لك بالتفكير أكثر في ما ستفعله بهذه البيانات بدلاً من التفكير في كيفية استردادها في المقام الأول.

توجد العديد من طرق الاستعلام المحددة لكل غرض ، ويمكنك قراءة كل شيء عنها في وثائق Rails الرسمية ، لكني سأتناول اليوم الطرق الثلاثة الأكثر شيوعًا والاختلافات بينها ، بالإضافة إلى بعض الطرق المشابهة ذات الصلة مع أمثلة كود السياقية:

  1. .تجد()
  2. .find_by ()
  3. .أين()

.تجد()

قد يكون find () أبسط طريقة استعلام على الإطلاق ، ولكنه مع ذلك طريقة قوية. يسمح لك باسترداد كائن واحد من قاعدة البيانات المتعلقة بالمفتاح الأساسي (ID) الذي تقوم بتمريره كوسيطة. لنفترض أنك قمت بإعداد فصل يمثل ضيفًا في برنامج حواري في وقت متأخر من الليل:

نظرًا لأنه يتم حفظ كل مثيل للضيف بعد إنشائه ، فإنه يتم توفير مفتاح أساسي أو معرف في قاعدة البيانات. لاسترداد مثيل الضيف هذا في المستقبل ، ما عليك سوى ملء find () في فئة الضيف على هذا النحو (حفظه في متغير لأغراض المثال):

والذي سيعيد مثيل فئة الضيف عند استدعائه:

مكافئ SQL الجاري تشغيله تحت غطاء أسلوب find () أعلاه هو:

قد يبدو أن find () طريقة محددة للغاية - فبعد كل شيء ، كم مرة ستعرف بالضبط ما هو معرف مثيل كائن في قاعدة بياناتك؟ والمثير للدهشة أنك ستتمكن من الوصول إلى المعرّفات أكثر مما تعتقد ، خاصة عند استخدام معلمات HTTP في Rails. ولكن مع ذلك ، فهي تخدم غرضًا محددًا للغاية.

تجدر الإشارة إلى أنه يمكنك إرجاع مثيلات متعددة من خلال تمرير مجموعة من المفاتيح الأساسية كوسيطة:

يمكنك تحقيق شيء مشابه باستخدام:

.يأخذ

الذي يتلقى رقمًا كوسيطة ويسترد العديد من مثيلات الفصل بترتيب تصاعدي.

تتضمن اللقطات المماثلة من find ():

.أولا و أخيرا

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

وهذا يقودنا إلى طريقة الاستعلام التالية والأكثر تنوعًا: find_by ()

.find_by ()

للوهلة الأولى ، قد يبدو .find_by () مألوفًا ، لكن السمات المألوفة تنتهي بسرعة. مثل .find () ، فإن .find_by () يُرجع ضمنيًا كائنًا واحدًا فقط من الفئة ، ولكنه يميز نفسه عن طريق السماح بالسمات الأخرى إلى جانب المفتاح الأساسي الذي يتم البحث عنه ، والسماح بالبحث عن أكثر من سمة في وقت واحد. على سبيل المثال ، قد ترغب في البحث عن ضيف بالبحث عن اسمه:

SQL المعادلة هنا:

رائع ، لقد استعدنا شيئًا! لكن انتظر ، هذا هو الممثل مايكل ج. فوكس ، وأردنا العثور على رائد الفضاء مايكل ج. فوكس! (ملاحظة: هذا مجرد مثال ، لا يمكنني تأكيد أو إنكار وجود رائد فضاء يدعى مايكل ج. فوكس).

للعثور على هذا المثال ، يمكننا تحديد المزيد:

مرحى! بفضل قدرتنا على صقل بحثنا ، فقد ظهرنا المثال الصحيح لفئة الضيف. هذه هي قوة .find_by (). يمكنك نظريًا البحث عن العديد من سمات الصف كما تريد من أجل تضييق نطاق البحث.

يمكنك أيضًا استخدام .find_by () للعثور على فئات محددة للنجار في تطبيقاتك ، وهي أداة متعددة الاستخدامات للغاية لإنشاء طرق الفصل. لنفترض أن ضيفًا قد ظهر في حلقة معينة من برنامج حواري ، وأردت العثور على المعلومات المرتبطة بهذا المظهر. إذا كانت فئة المظهر موجودة على هذا النحو:

يمكنك استخدام .find_by () لاسترداد ذلك المظهر المحدد من المظهر بسهولة تامة ، وإدراج هذا المنطق في أي مكان تريده. دعنا نستخدمها كطريقة فصل للضيف:

عند استخدامها على مثيل الضيف وعند إعطاء مثيل من حلقة كوسيطة ، فإن هذا سيعيد مثيل ذلك المظهر المحدد. رائعة حقا!

"لكن" ، قد تقول ، "ماذا لو كنت أرغب في استرداد أمثلة متعددة من الفصل الدراسي؟ ماذا لو كنت أرغب في استرداد كل مثيل لكل من الممثل مايكل جاي فوكس ومايكل جاي فوكس رائد الفضاء؟ "

أنا سعيد لأنك سألت ، لأن هذا هو المكان الذي تلعب فيه طريقتنا التالية والأخيرة: .where ()

.أين()

من بين طرق البحث الثلاثة الرئيسية التي نتطرق إليها في هذا المنشور ، ربما يكون () هو الأكثر تنوعًا ، ولكنه أيضًا الأكثر تعقيدًا والأسهل للتشويش عليه.

بينما يُرجع .find () و .find_by () مثيلات مفردة لكائن ، حيث يُرجع .where () ما يُسمى "كائن ActiveRecord :: Relation" ، بشكل أساسي مجموعة من الحالات مع بعض المعلومات الإضافية المرفقة. ونتيجة لذلك ، فإن استخدام .where () بشكل كامل سيتطلب أيضًا بعض المعرفة الوسيطة للعمل مع صفائف المعلومات المتداخلة.

يجب النظر إلى .where () كطريقة "الحالة" ، ويعرف أيضًا بالطريقة التي تسمح لك بالتحكم في الكائنات التي يتم إرجاعها عن طريق تعيين "الشروط" لتمشيط قاعدة البيانات الخاصة بك مع وتحديد ما يتم إرجاعه. مرة أخرى ، أشجع على قراءة وثائق ريلز حول الشروط لمواضيع أكثر تقدمًا ، لكنني سأتطرق إلى حالات الاستخدام الأساسية التي من المحتمل أن تحتاج إليها. أين () لتغطيتها.

يمكنك كتابة بناء جملة طلب .where () بشكل مماثل لأمثلةنا السابقة للعثور على جميع مثيلات المدعوين مايكل جي فوكس:

واو ، الآن هناك المزيد! لدينا الرسام مايكل جي فوكس ، والموسيقي مايكل جي فوكس أيضًا. باستخدام طريقة واحدة بسيطة حصلنا على مجموعة من كل ضيف بهذا الاسم - يا لها من أداة قوية!

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

إذا كانت هناك حالات متعددة لممثلين باسم مايكل جيه. فوكس ، يمكنك صياغة الاستعلام بطريقة مشابهة لطلب .find_by ():

أو يمكنك التعبير عنها بشكل أكثر تشابهًا مع SQL ، كما يلي:

يفضل هذا الصياغة في معظم الحالات ، حيث إن تمرير الحجج بشكل غير مباشر من خلال s يسمح بمزيد من الأمان في المعلمات الخاصة بك ويوفر طبقة من الحماية ضد إدخال التعليمات البرمجية الخبيثة. ليس هناك ما يدعو للقلق بشأن الخفاش عند التعلم ، ولكن من المهم أن تضع في اعتبارك.

إذا كنت ترغب في استرداد جميع حالات مايكل جي فوكس الممثل أو رائد الفضاء مايكل جي فوكس ، يمكنك ربط طلبات .where () معًا لإنشاء استعلام أكثر تعقيدًا:

إن ربط الطلبات المتشابهة معًا باستخدام. .

الآن بعد أن تعلمنا جميع طرق البحث الثلاثة الأكثر انتشارًا في Rails و ActiveRecord ، فإن الخطوة التالية هي التدرب عليها واستخدامها في تطبيقاتك الخاصة! بالرجوع إلى وثائق Rails ، سيستمر تقديم التوجيه والمراجعة الإضافية في رحلتك. حظا سعيدا!