2010-06-30 3 views
3

Je travaille sur une application Rails qui permet aux utilisateurs de définir des tâches qui nécessitent un due_date. Le due_date peut inclure ou non une heure.Quelle est la manière correcte de gérer les informations de temps optionnelles dans Rails?

La façon dont nous sommes la manipulation de ce droit se sent maintenant comme un hack. due_date s par défaut à 12:00 AM, et dans ce cas, nous n'affichons pas une heure. L'objet DateTime ne permet pas de valeurs de temps vides autant que je sache.

Dois-je diviser cette information en deux colonnes dans la base de données? Comment allez-vous gérer ça?

+0

Quelle est votre base de données? supporte-t-il les champs date/heure séparés? –

+0

MySQL, donc il prend en charge les types de date et heure au lieu de DateTime –

Répondre

3

Étant donné que votre structure de données doit accueillir les dates avec et sans temps, vous avez deux choix:

Utilisez un objet DateTime Ruby avec une valeur de drapeau pour le moment d'indiquer que la date n'a pas temps. La valeur de drapeau habituelle est 0, ce qui signifie que l'heure de minuit ne peut pas être affichée. (Minuit est 0 secondes après la journée a commencé.)

Par exemple, l'analyse syntaxique "1 janvier 2010" dans un DateTime vous donnera 1 janvier 2010 00:00.

Sinon, vous aurez besoin d'inventer votre propre structure de données. Le plus facile serait probablement une classe avec un DateTime et un drapeau booléen "show_time". - en utilisant un DateTime pour conserver l'heure, vous serez capable d'utiliser les méthodes de sortie DateTime, et de faire de l'arithmétique avec eux si nécessaire.

Créer une nouvelle structure de données n'est pas une grosse affaire dans Ruby, mais si vous pouvez vivre sans tâches dues exactement à minuit, je recommanderais la méthode 1. Notez que vous voudrez probablement les imprimer sans temps puisque c'est ce que le définisseur de tâche a demandé. Ou vous pouvez inclure "(à tout moment)" dans la sortie.

PS

Attention aux fuseaux horaires! Beaucoup de manières de manipuler, mais vous devriez être sûr d'en choisir un délibérément.

+0

Comment procéder pour stocker cette structure de données dans Rails? –

+0

@Andrew, en "stockant" vous voulez dire stocker dans la base de données? Vous devez soit stocker en tant que valeurs discrètes (un booléen et un datetime), soit sérialiser la structure de données dans un blob/texte. Pour un petit obj tel que juste un datetime et un bool, le stockage de deux vals discrets est meilleur/plus facile/plus clair que la sérialisation. Posez une nouvelle question sur SO si vous souhaitez plus d'aide. Cordialement. –

1

La division des attributs peut être inutilement complexe. Pourquoi ne pas adopter une convention qui si aucune heure n'est spécifiée alors par défaut à minuit ou midi à la date en question? Sauf si vous devez être capable de faire la distinction entre les deux cas, c'est-à-dire minuit, car il a été explicitement spécifié ou minuit parce qu'aucune heure n'a été spécifiée. Si ce dernier les séparant alors peut être conseillé ou juste ajouter un booléen pour désambiguïser les cas.

Si vous pensiez que vous aviez plus utiliser pour une date séparée et le temps et dépenserait beaucoup de fractionnement d'énergie un champ unique pour d'autres raisons qui pourraient alors plaider aussi pour le fractionnement.

Questions connexes