أفضل الممارسات لتصميم النماذج في روبي أون ريلز

StackOverflow https://stackoverflow.com/questions/62529

سؤال

تقترح دروس RoR نموذجًا واحدًا لكل جدول لكي يعمل ORM.يحتوي مخطط DB الخاص بي على حوالي 70 جداول مقسمة من الناحية المفاهيمية إلى 5 مجموعات من الوظائف (على سبيل المثال ، يتم تقليل أي جدول معين في مجموعة وظيفية واحدة فقط ، والعلاقات بين الجداول من المجموعات المختلفة.هل يجب أن أصمم نموذجًا لكل مجموعة مفاهيمية، أم يجب أن يكون لدي 70 نموذجًا لريلز وأترك ​​المجموعة "مفاهيمية"؟شكرًا!

هل كانت مفيدة؟

المحلول

أقوم بتغطية هذا في أحد تطبيقاتي الكبيرة فقط عن طريق التأكد من تجميع الجداول/النماذج حسب الاسم (مع علاقة نموذج الجدول 1:1 تقريبًا).مثال:

events
event_types
event_groups
event_attendees
etc...

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

نصائح أخرى

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

يجب عليك بالتأكيد استخدام نموذج واحد لكل جدول للاستفادة من سحر ActiveRecord.

ولكن يمكنك أيضًا تجميع نماذجك معًا في مساحات أسماء باستخدام الوحدات والأدلة الفرعية، لتجنب الاضطرار إلى إدارة 70 ملفًا في دليل النماذج الخاص بك.

على سبيل المثال، يمكن أن يكون لديك:

app/models/admin/user.rb
app/models/admin/group.rb

للنماذج Admin::User وAdmin::Group و

app/models/publishing/article.rb
app/models/publishing/comment.rb

للنشر::المقال والنشر::تعليق

وهكذا دواليك...

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

هل الجداول مرتبطة بنوع ما من نمط الميراث أم يمكن أن تكون كذلك؟يمكن أن تقوم ريلز بشكل محدود من الميراث.ابحث عن وراثة الجدول الواحد (STI).

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

قبل البدء في صنع 70 نموذجًا، يرجى التفكير في هذا السؤال لمساعدتك في اتخاذ القرار:

هل سيتم اعتبار كل جدول من جداولك "كائنًا" على سبيل المثال جدول "سيارات" أم أن بعض الجداول تحتوي على معلومات العلاقة فقط، وجميع أعمدة المفاتيح الخارجية على سبيل المثال؟

في Rails فقط جداول "الكائن" تصبح نماذج!(مع بعض الاستثناءات لأنواع معينة من الارتباطات) لذا فمن المحتمل جدًا أنه إذا كان لديك 5 مجموعات فقط من الوظائف، فقد لا يكون لديك 70 نموذجًا.وأيضًا، إذا كانت مجموعات الوظائف التي ذكرتها مختلفة تمامًا، فقد تكون أكثر ملاءمةً للتطبيق الخاص بها.

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

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

app/models/admin/base.rb - module Admin::Base, included by all other Admin::xxx
app/models/admin/user.rb - class Admin::User, includes Admin::Base
app/models/admin/group.rb - class Admin::Group, includes Admin::Base

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

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

لا تحتاج إلى إنشاء وحدة تحكم + طرق عرض لكل نموذج (كما أجاب srboisvert).ما عليك سوى وحدة تحكم لكل مورد (والتي أتوقع أن تكون أقل بكثير من 70 - ربما 10 أو 15 فقط أو نحو ذلك وفقًا لوصفك).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top