Trouver des Enregistrements avec Datetime qui correspondent à la date d'aujourd'hui - Ruby on Rails
J'ai une table des promotions et de la nécessité de trouver des enregistrements dont la date correspond à la date d'aujourd'hui.
À partir de la console rails, le champ date j'ai besoin de match ressemble à ceci. J'ai assigné un enregistrement à traiter pour les tests.
ruby-1.9.2-p0 > deal.start
=> Tue, 10 May 2011 00:00:00 UTC +00:00
Si j'essaie de trouver tous les enregistrements correspondant à la date de début à aujourd'hui, comme cela je reçois néant
ruby-1.9.2-p0 > Deal.find_by_start(Date.today)
=> nil
alors j'ai pensé que je pourrais le match par la conversion d'une Date.aujourd'hui datetime.
ruby-1.9.2-p0 > Date.today.to_datetime
=> Tue, 10 May 2011 00:00:00 +0000
ruby-1.9.2-p0 > Deal.find_by_start(Date.today.to_datetime)
=> nil
Comment puis-je obtenir que cela fonctionne? Je suis à l'aide de Rails 3.
Edit:
Je pensais que sur la conversion à un format cohérent qui fonctionne, mais pas lorsque vous essayez d'utiliser la find_by_start méthode
ruby-1.9.2-p0 > deal.start.strftime("%a, %e %B %Y") == Date.today.strftime("%a, %e %B %Y")
=> true
ruby-1.9.2-p0 > Deal.find_by_start.strftime("%a, %e %B %Y") == Date.today.strftime("%a, %e %B %Y")
NoMethodError: undefined method `strftime' for nil:NilClass
Vous devez vous connecter pour publier un commentaire.
Garder à l'esprit un DateTime détient une date et une heure, de sorte que vous êtes à la recherche pour les documents qui ont une valeur précise, et pas seulement le jour même.
Vous pouvez le faire de deux façons. Vous pouvez soit sélectionner la plage de temps depuis le début de la journée, à la fin, ou vous pouvez créer un
date
colonne à l'aide de vos données mieux.La gamme version ressemble à ceci:
L'autre nécessite la création d'un nouveau
start_date
colonne de votre tableau et de les remplir avec les dates en conséquence. Vous pouvez indice de cette date et à vos requêtes s'exécutent beaucoup plus rapidement, comme sélections de plages ne sont pas toujours rapide sur de grands ensembles de données.Deal.where(start: Time.zone.now.midnight)
fonctionne également.Rails 5.1 a introduit
Date#all_day
helper, qui renvoie un objet range pour une date donnée, de sorte que vous pouvez simplement écrire:Vous pouvez également utiliser SQL
DATE()
fonction de votre objectif, comme par exemple:Deal.where(start: Date.parse("YYYY-MM-DD").all_day)
fera l'affaire).Pour ceux qui sont encore sur les Rails 4:
Pour augmenter not_a_patch la réponse ci-dessus, je voudrais utiliser:
parce que
Time.zone
va utiliser UTC (qui est la façon dont votre date heure terrain est stocké), tandis queDateTime.now
ne sera pas.