2009-08-10 8 views
32

Rails a été bon avec l'insertion automatique des dates correctement formatées en MySql sans avoir besoin de beaucoup réfléchir. Cependant, pour faire une validation, j'ai besoin de vérifier si une valeur datée mysql datetime (ie 2008-07-02 18:00:00) est supérieure ou inférieure à "maintenant". Je peux appeler DateTime.now ou Time.now mais comment puis-je convertir cela dans le format mysql aime?Ruby datetime approprié pour la comparaison mysql

Merci

Répondre

83

Vous pouvez utiliser to_s(:db) convertir en une base de données format convivial.

Time.now.to_s(:db) 

Cependant, soyez prudent si vous avez un fuseau horaire spécifié dans Rails parce que le temps sera stocké dans UTC dans la base. Vous devrez spécifier cela pour faire des comparaisons appropriées.

Time.now.utc.to_s(:db) 

Vous pouvez également utiliser la fonction NOW() dans MySQL au lieu de générer l'heure actuelle dans Ruby.

+15

merci. c'est génial d'avoir le gars railscasts répondre à vos questions :) – user94154

+1

Cela devrait vraiment être une méthode dans les rails! – Hopstream

+0

100 merci. Cette réponse m'a juste rappelé l'existence de NOW(). ActiveRecord m'a bien gâté. J'ai passé Time.now maintenant que je touche à peine SQL. Fini le temps de peaufiner SQL (au moins pour moi). – Swartz

5

Vous n'en avez pas besoin. Laissez Rails faire le travail pour vous:

Si votre modèle est Widget ce trouvera tous les widgets qui ont été créés dans le dernier jour:

Thing.find(:all, :condition => ["created_at > ?", Time.now - 1.day]) 

Rails convertit automatiquement l'horodatage dans le format correct.

+0

merci pour la réponse, mais cela ne correspond pas à mon cas d'utilisation. J'ai déjà mon objet récupéré de la DB. Longtemps après avoir été récupéré, j'ai besoin d'exécuter une validation basée sur le temps, donc la vérification doit être faite en code Ruby et non dans une requête. Merci encore. – user94154

+0

J'ai eu un scénario différent, et cela a fonctionné parfaitement. Merci. – aronchick

+0

Dans Rails 4+, il suffit d'utiliser 'Thing.where ('created_at>?', 6.months.ago)' –

Questions connexes