2011-05-10 20 views
25

Anlaşma tablosu ve tarihin günümüzün tarihiyle eşleşen kayıtlarını bulmam gerekiyor.Bugünün tarihine uyan Tarih ile Kayıtları Bul - Ruby on Rails

Raylar konsolundan eşleştirmem gereken tarih alanı buna benzer. Test etmek için bir kayıt yaptırdım. Böyle bugün başlangıç ​​tarihini eşleşen herhangi bir kayıt bulmak için çalışırsanız

ruby-1.9.2-p0 > deal.start 
=> Tue, 10 May 2011 00:00:00 UTC +00:00 

Ben

ruby-1.9.2-p0 > Deal.find_by_start(Date.today) 
=> nil 

nil o zaman ben bir tarih için Date.today dönüştürerek maç düşündüm olsun.

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 

Bunu nasıl çalıştırabilirim? Ben Rails 3. kullanıyorum

Düzenleme: Ben eserler ancak bir DateTime bir tutan

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 

cevap

46

unutmayın find_by_start yöntemini kullanarak çalışırken olmaz tutarlı bir biçimde onları hem dönüştürme hakkında düşünce tarih ve bir saat, yani sadece aynı gün değil, kesin bir değere sahip kayıtları arıyorsunuz.

Bunu iki yoldan yapabilirsiniz. Günün başından sonuna kadar zaman aralığını seçebilir veya verilerinizi daha iyi bir şekilde gruplandırmanıza yardımcı olacak bir date sütun oluşturabilirsiniz.

aralık sürümü şuna benzer:

@deals = Deal.where('start BETWEEN ? AND ?', DateTime.now.beginning_of_day, DateTime.now.end_of_day).all 

diğeri senin tablosunda yeni start_date sütun oluşturma ve buna göre tarihleri ​​ile doldurma gerektirir. Aralık seçimleri büyük veri kümelerinde her zaman hızlı olmadığından, bu tarihi dizine ekleyebilir ve sorgularınızın daha hızlı çalışmasını sağlayabilirsiniz.

+0

Teşekkürler. Bu harika çalışıyor ve bunu kısa vadede kullanacağım ve performans iyileştirmeler için kodumun yeniden düzenlenmesine bakacağım. Yardım ettiğin için teşekkür ederim. –

+12

Ayrıca aralıkları kullanarak daha kısa bir versiyon var. @deals = Deal.where (start: DateTime.now.beginning_of_day .. DateTime.now.end_of_day) –

+0

'Deal.where (start: Time.zone.now.midnight) 'da çalıştığını buluyorum. –

23

Raylar 5,1 belirli bir tarih için bir aralık nesnesi döndürür Date#all_day yardımcı, tanıttı, böylece sadece yazabilirsiniz:

Deal.where(start: Date.today.all_day) 

Ayrıca amaç için, örneğin SQL DATE() işlevini kullanabilirsiniz:

, yukarıda I not_a_patch cevabını artırmak için: Raylar 4 hala olanlar için

@deals = Deal.where('DATE(start) = ?', Date.today) 
2

kullanırsınız: UTC kullanacak

Deal.where(start: Time.zone.now.beginning_of_day..Time.zone.now.end_of_day) 

Time.zone çünkü DateTime.now olmaz iken (tarih süresi alanı nasıl saklanacağını olan).

> DateTime.now 
=> Fri, 08 Sep 2017 11:28:21 -0400 
> Time.zone.now 
=> Fri, 08 Sep 2017 15:29:53 UTC +00:00