Domanda

Quello che voglio fare è molto semplice ma sto cercando di trovare il modo migliore o più elegante per farlo. L'applicazione Rails che sto costruendo ora avrà un programma di lezioni giornaliere. Per ogni classe i campi rilevanti per questa domanda sono:

  • Giorno della settimana
  • Ora di inizio
  • Ora di fine

Una singola voce potrebbe essere qualcosa del tipo:

  • giorno della settimana: mercoledì
  • ora di inizio: 10:00
  • orario di fine: mezzogiorno

Inoltre, devo menzionare che si tratta di un'app Rails 2.2 bilingue e sto usando la funzione nativa i18n Rails. In realtà ho diverse domande.

Per quanto riguarda il giorno della settimana, devo creare una tabella aggiuntiva con un elenco di giorni o esiste un modo integrato per creare tale elenco al volo? Tieni presente che questi giorni della settimana dovranno essere resi in inglese o spagnolo nella vista pianificazione a seconda della variabile locale.

Durante l'interrogazione del programma, dovrò raggruppare e ordinare i risultati per giorno della settimana, dal lunedì alla domenica, e ovviamente ordinare le lezioni ogni giorno entro l'orario di inizio.

Per quanto riguarda l'ora di inizio e l'ora di fine di ogni classe useresti campi datetime o campi interi? Se quest'ultimo come lo implementeresti esattamente?

Non vedo l'ora di leggere i diversi suggerimenti che vi verranno in mente.

È stato utile?

Soluzione

Vorrei solo memorizzare il giorno della settimana come numero intero. 0 = > Lunedi ... 6 = > Domenica (o in qualsiasi modo tu voglia. Cioè 0 = > domenica). Quindi memorizzare l'ora di inizio e l'ora di fine come Ora.

Ciò renderebbe il raggruppamento davvero semplice. Tutto quello che dovresti fare è ordinare in base al giorno della settimana e all'ora di inizio.

Puoi visualizzarlo in più modi, ma ecco cosa farei.

  1. Hanno funzioni come: @sunday_classes = DailyClass.find_sunday_classes che restituisce tutte le classi della domenica ordinate per ora di inizio. Quindi ripetere per ogni giorno.

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

    Nota: find_by probabilmente dovrebbe avere id alla fine, ma questa è solo la preferenza nel modo in cui vuoi nominare la colonna.

  2. Se si desidera l'intera settimana, chiamare tutti e sette dal controller e scorrere attraverso di essi nella vista. Puoi persino creare pagine di dettagli per ogni giorno.

  3. La traduzione è l'unica parte difficile. Puoi creare una funzione di supporto che accetta un numero intero e restituisce il testo per il giorno della settimana appropriato in base a locale.

È molto semplice. Niente di complicato.

Altri suggerimenti

Se i tuoi dati sono orari, li memorizzerei come orario, altrimenti dovrai sempre convertirli dal database quando esegui operazioni relative a data e ora. Il giorno sono dati ridondanti, poiché faranno parte dell'oggetto time.

Ciò dovrebbe significare che non è necessario memorizzare un elenco di giorni.

Se t è un momento, allora

t.strftime('%A')

ti darà sempre il giorno come una stringa in inglese. Questo potrebbe quindi essere tradotto da i18n come richiesto.

Quindi devi solo memorizzare l'ora di inizio e l'ora di fine, oppure l'ora e la durata di inizio. Entrambi dovrebbero essere equivalenti. Sarei tentato di memorizzare l'ora di fine da solo, nel caso in cui tu debba fare manipolazioni dei dati sugli orari di fine, che quindi non dovranno essere calcolati.

Penso che la maggior parte del resto di ciò che descrivi dovrebbe anche cadere dalla memorizzazione dei dati temporali come istanze di Time.

L'ordinamento per giorno e ora della settimana sarà solo una questione di ordinamento per colonna temporale. cioè.

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

Il raggruppamento per giorno è un po ' più complicato. Tuttavia questo è un post eccellente su come raggruppare per settimana. Il raggruppamento per giorno sarà analogo.

Se hai a che fare con volumi di dati non banali, potrebbe essere meglio farlo nel database, con un find_by_sql e che potrebbe dipendere dalla funzionalità di data e ora del tuo database, ma ancora l'archiviazione dei dati come ora ti aiuterà anche qui. Ad esempio in Postgresql (che io uso), ottenere la settimana di una lezione è

date_trunc('week', starting_time)

che è possibile utilizzare in una clausola Group By o come valore da utilizzare in alcune logiche di loop nei binari.

Per i giorni della settimana, se devi avere ad es. classi che soddisfano 09: 00-10: 00 su MWF, quindi puoi utilizzare una tabella separata per giorni in cui una classe incontra (codificata sia da ID classe e DOW) o essere malvagia (cioè non normalizzata) e mantenere l'equivalente di un matrice di DOW in ogni classe. L'argomento classico è questo:

  • La tabella separata può essere indicizzata in modo da supportare selezioni orientate alla classe o orientate al DOW, ma richiede un po 'più di colla per riunire l'intera immagine per una classe.
  • L'array-of-DOW è più semplice da visualizzare per i programmatori principianti e leggermente più semplice da programmare, ma significa che il ragionamento su DOW richiede di guardare tutte le classi.

Se questo è solo per il tuo programma personale, fai ciò che ti dà il valore che stai cercando e vivi con le conseguenze; se stai cercando di costruire un sistema reale per più utenti, sceglierei una tabella separata. Tutte quelle regole di normalizzazione sono lì per un motivo.

Per quanto riguarda i nomi DOW (leggibili dall'uomo), questo è un problema a livello di presentazione e non dovrebbe essere nel concetto principale di DOW. (Supponiamo che tu abbia deciso di trasferirti a Montreal e di aver bisogno del francese? Dovrebbe essere un'altra "faccia" e non una modifica all'implementazione di base.)

Per quanto riguarda gli orari di inizio / fine, ancora una volta il problema sono i tuoi requisiti. Se tutte le classi iniziano e finiscono ai limiti dell'ora (x: 00), puoi certamente usare 0..23 come le ore del giorno. Ma poi la tua vita sarebbe miserabile non appena dovessi ospitare quel seminario di 45 minuti. Come diceva il vecchio annuncio pubblicitario, " Pagami ora o pagami dopo. & Quot;

Un approccio sarebbe quello di definire il tuo concetto ClassTime e suddividere tutti i ragionamenti sui tempi di quella classe. Potrebbe iniziare con una rappresentazione semplicistica (ore integrali 0..23 o minuti integrali dopo la mezzanotte 0..1439) e quindi "crescere". secondo necessità.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top