Frage

Was ich tun möchte, ist sehr einfach, aber ich versuche, die beste oder elegante Art und Weise zu finden, dies zu tun. Die Rails-Anwendung Ich bin jetzt bauen einen Zeitplan des täglichen Klassen haben. Für jede Klasse der Felder relevant zu dieser Frage sind:

  • Tag der Woche
  • Startzeit
  • Endzeit

Ein einzelner Eintrag könnte etwas wie:

  • Tag der Woche: Mittwoch,
  • Startzeit: 10.00 Uhr
  • Endzeit: Noon

Auch muss ich erwähnen, dass es sich um eine bi-lingual Rails 2.2 app ist, und ich bin mit dem nativen i18n Rails verfügen. Ich habe tatsächlich einige Fragen.

In Bezug auf den Tag der Woche, sollte ich schaffen eine zusätzliche Tabelle mit der Liste der Tage, oder gibt es eine eingebaute Möglichkeit, diese Liste on the fly zu erstellen? Denken Sie daran, wird in diesen Tagen der Woche müssen in Englisch oder Spanisch in der Planansicht wiedergegeben werden in Abhängigkeit von der Locale-Variable.

Während der Zeitplan abfragen will ich zu einer Gruppe müssen und die Ergebnisse von Tag bestellen, von Montag bis Sonntag und natürlich um die Klassen innerhalb eines jeden Tag Zeit zu starten.

Im Hinblick auf die Startzeit und Endzeit jeder Klasse würden Sie Datetime-Felder oder Integer-Felder verwenden? Wenn letzteres, wie Sie dies genau umsetzen würden?

Wir freuen uns, die verschiedenen Vorschläge euch mit kommen bis zu lesen.

War es hilfreich?

Lösung

Ich würde speichern nur den Tag der Woche als Integer. 0 => Montag ... 6 => Sonntag (oder wie Sie wollen. Dh. 0 => Sonntag). Dann speichern Sie die Startzeit und die Zeit als Zeit beenden.

Das würde die Gruppierung macht wirklich einfach. Alles, was Sie haben würden durch den Tag der Woche und die Startzeit ist eine Art zu tun.

Sie können in mehr Möglichkeiten, dies anzuzeigen, aber hier ist es, was ich tun würde.

  1. Haben Sie Funktionen wie: @sunday_classes = DailyClass.find_sunday_classes, die alle Klassen für den Sonntag nach Startzeit sortiert zurückgibt. Dann wiederholen Sie für jeden Tag.

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

    . Hinweis: find_by wahrscheinlich sollte id am Ende hat, aber das ist nur bevorzugt, wie Sie wollen, um die Spalte nennen

  2. Wenn Sie die ganze Woche wollen dann alle sieben von der Steuerung aufrufen und Schleife Trog sie in der Ansicht. Sie könnten sogar Detailseiten für jeden Tag erstellen.

  3. Die Übersetzung ist der einzige schwierige Teil. Sie können eine Hilfsfunktion erstellen, die eine ganze Zahl und gibt den Text für den entsprechenden Tag der Woche auf lokaler Basis nimmt.

Das ist sehr einfach. Nichts kompliziert.

Andere Tipps

Wenn Ihre Daten eine Zeit ist, dann würde ich speichern, dass als Time - sonst werden Sie immer es aus der Datenbank zu konvertieren, wenn Sie Datum und Uhrzeit im Zusammenhang Operationen darauf tun. Der Tag ist redundante Daten, wie sie einen Teil des Zeit-Objekts sein.

Dies sollte bedeuten, dass Sie nicht eine Liste von Tagen speichern müssen.

Wenn t eine Zeit dann

t.strftime('%A')

Sie werden immer geben, den Tag als String in Englisch. Dies könnte dann durch i18n übersetzt werden, wie erforderlich.

So Sie nur speichern, müssen Startzeit und Endzeit oder Startzeit und Dauer. Beide sollten gleichwertig sein. Ich wäre versucht zu speichern Zeit, mich am Ende, falls Sie Datenmanipulationen tun müssen, um auf Endzeiten, die daher nicht berechnet werden müssen.

Ich denke, die meisten der Rest von dem, was Sie beschreiben, sollte auch aus Speicherung Zeitdaten als Instanzen der Zeit fallen.

Bestellung von Wochentag und die Zeit wird nur eine Frage der Bestellung durch Ihre Zeitspalte sein. d.

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

für Tag Gruppierung ist ein wenig komplizierter. Jedoch ist dies ein ausgezeichneter Beitrag , wie von Woche zu gruppieren. Gruppierung nach Tag wird analog.

Wenn Sie mit nicht-trivialen Datenmengen zu tun hat, kann es besser sein, es in der Datenbank zu tun, mit einem find_by_sql und sie verlassen können auf Ihrer Datenbank Uhrzeit und das Datum Funktionalität, aber auch hier die Daten als Zeit Speicherung werden helfen Sie auch hier. Zum Beispiel in Postgresql (die ich verwende), die Woche einer Klasse bekommen ist

date_trunc('week', starting_time)

, die Sie in einem GROUP BY-Klausel oder als Wert in einem gewissen Schleifenlogik zu verwenden, in Schienen verwenden können.

Re Tage-of-Woche, wenn Sie zum Beispiel haben müssen Klassen, die 09 erfüllen: 00-10: 00 auf MWF, entweder Sie könnten dann oder böse sein (dh nicht-normalisiert) und halten verwenden (sowohl der Klassen-ID und DOW verkeilt) das Äquivalent eines eine separate Tabelle für Tag eine Klasse erfüllt Array von DOW in jeder Klasse. Das klassische Argument ist folgende:

  • Die separate Tabelle kann in einer Weise indiziert werden entweder klassenorientiert oder DOW orientiert wählt zu unterstützen, aber nimmt ein wenig mehr Leim das gesamte Bild für eine Klasse zusammen zu stellen.
  • Die Array-of-DOW ist einfacher zu visualisieren für Programmierer beginnen und etwas einfacher zu kodieren, sondern bedeutet, dass Argumentation über DOW erfordert Blick auf alle Klassen.

Wenn dies nur für den persönlichen Stundenplan ist, tun, was Sie den Wert bekommt, die Sie suchen, und leben mit den Folgen; wenn Sie versuchen, ein echtes System für mehrere Benutzer zu bauen, würde ich mit einem separaten Tisch gehen. All diese Normalisierungsregeln gibt es für einen Grund.

Was (für Menschen lesbaren) Namen DOW, das ist ein Präsentationsschicht-Problem und soll nicht in dem Kernkonzept von DOW sein. (Angenommen, Sie nach Montreal zu bewegen beschlossen und benötigt Französisch? Das sollte ein anderes „Gesicht“ sein und nicht eine Änderung der Kern Implementierung.)

Wie für den Start / Endzeiten, wieder das Problem ist, Ihre Anforderungen. Wenn alle Klassen beginnen und enden bei der Stunde (x: 00) Grenzen, könnte man sicherlich 0..23 wie die Stunden des Tages nutzen. Aber dann würde Ihr Leben unglücklich sein, sobald Sie, dass die 45-minütige Seminar aufzunehmen haben. Wie die alten kommerziell sagte, „ich jetzt bezahlen oder später mich bezahlen.“

Ein Ansatz wäre eine eigenes Konzept classtime zu definieren und alle Überlegungen über Zeiten zu dieser Klasse partitionieren. Es könnte mit einer vereinfachten Darstellung (Integral-Stunden 0..23 oder integral Minuten nach Mitternacht 0..1439) beginnt und dann „wachsen“ je nach Bedarf.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top