سؤال

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

  • يوم من أيام الأسبوع
  • وقت البدء
  • نهاية الوقت

يمكن أن يكون الإدخال الفردي شيئًا مثل:

  • يوم من الأسبوع:الأربعاء
  • وقت البدء:10:00 ص
  • نهاية الوقت:وقت الظهيرة

ويجب أن أذكر أيضًا أنه تطبيق Rails 2.2 ثنائي اللغة وأنني أستخدم ميزة i18n Rails الأصلية.في الواقع لدي عدة أسئلة.

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

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

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

نتطلع إلى قراءة الاقتراحات المختلفة التي ستطرحها يا رفاق.

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

المحلول

أود فقط تخزين يوم الأسبوع كعدد صحيح.0 => الاثنين ...6 => الأحد (أو بأي طريقة تريدها.أي.0 => الأحد).ثم قم بتخزين وقت البدء ووقت الانتهاء كوقت.

وهذا من شأنه أن يجعل التجميع سهلاً حقًا.كل ما عليك فعله هو الفرز حسب يوم الأسبوع ووقت البدء.

يمكنك عرض هذا بطرق متعددة، ولكن هنا ما سأفعله.

  1. لديك وظائف مثل: @sunday_classes = DailyClass.find_sunday_classes يقوم بإرجاع جميع الفصول ليوم الأحد مرتبة حسب وقت البدء.ثم كرر كل يوم.

    def find_sunday_classes
      find_by_day_of_week(1, :order -> 'start_time')
    end

    ملحوظة:من المحتمل أن يكون لدى find_by معرف في النهاية ولكن هذا مجرد تفضيل في الطريقة التي تريد بها تسمية العمود.

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

  3. الترجمة هي الجزء الصعب الوحيد.يمكنك إنشاء دالة مساعدة تأخذ عددًا صحيحًا وترجع النص لليوم المناسب من الأسبوع بناءً على المستوى المحلي.

هذا أساسي جدًا.لا شيء معقد.

نصائح أخرى

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

يجب أن يعني هذا أنك لست بحاجة إلى تخزين قائمة الأيام.

إذا كان الوقت قد حان

t.strftime('%A')

سوف أعطيك دائمًا اليوم كسلسلة باللغة الإنجليزية.يمكن بعد ذلك ترجمة هذا بواسطة i18n كما هو مطلوب.

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

أعتقد أن معظم ما تصفه يجب أن يقع أيضًا خارج نطاق تخزين بيانات الوقت كمثيلات للوقت.

سيكون الترتيب حسب يوم الأسبوع والوقت مجرد مسألة ترتيب حسب عمود الوقت الخاص بك.أي.

daily_class.find(:all, :conditions => ['whatever'], :order => :starting_time)

التجميع حسب اليوم هو القليل أكثر صعوبة.لكن هذا هو وظيفة ممتازة حول كيفية التجميع حسب الأسبوع.سيكون التجميع حسب اليوم مشابهًا.

إذا كنت تتعامل مع كميات غير تافهة من البيانات، فقد يكون من الأفضل القيام بذلك في قاعدة البيانات، باستخدام find_by_sql وقد يعتمد ذلك على وظيفة الوقت والتاريخ في قاعدة البيانات الخاصة بك، ولكن تخزين البيانات كوقت سيساعدك أيضًا هنا.على سبيل المثال في Postgresql (الذي أستخدمه)، فإن الحصول على أسبوع الفصل الدراسي هو

date_trunc('week', starting_time)

والتي يمكنك استخدامها في جملة Group By، أو كقيمة لاستخدامها في بعض منطق الحلقة في Rails.

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

  • يمكن فهرسة الجدول المنفصل بطريقة تدعم إما التحديدات الموجهة نحو الفصل أو الموجهة نحو DOW، ولكنها تتطلب المزيد من الغراء لتجميع الصورة بأكملها معًا للفصل الدراسي.
  • إن مصفوفة DOW أسهل في التصور للمبرمجين المبتدئين وأسهل قليلاً في البرمجة، ولكنها تعني أن التفكير في DOW يتطلب النظر إلى الجميع الطبقات.

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

بقدر ما يتعلق الأمر بأسماء DOW (التي يمكن قراءتها بواسطة الإنسان)، فهذه مشكلة تتعلق بطبقة العرض التقديمي، ولا ينبغي أن تكون في المفهوم الأساسي لـ DOW.(لنفترض أنك قررت الانتقال إلى مونتريال، وتحتاج إلى الفرنسية؟يجب أن يكون هذا "وجهًا" آخر وليس تغييرًا في التنفيذ الأساسي.)

أما بالنسبة لأوقات البدء/الانتهاء، فالمسألة مرة أخرى تتعلق بمتطلباتك.إذا كانت جميع الفصول الدراسية تبدأ وتنتهي عند حدود الساعة (x:00)، فيمكنك بالتأكيد استخدام 0..23 كساعات اليوم.ولكن حياتك ستكون بائسة بمجرد أن تضطر إلى استيعاب تلك الندوة التي مدتها 45 دقيقة.وكما قال الإعلان القديم: "ادفع لي الآن أو ادفع لي لاحقًا".

تتمثل إحدى الطرق في تحديد مفهوم ClassTime الخاص بك وتقسيم جميع الأسباب المتعلقة بالأوقات إلى هذا الفصل.يمكن أن يبدأ بتمثيل مبسط (ساعات متكاملة 0..23، أو دقائق متكاملة بعد منتصف الليل 0..1439) ثم "تنمو" حسب الحاجة.

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