2011-07-03 8 views
13

Więc staram się robić rzeczy tak:Porównując datę, aby DateTime created_at w rails3

today = Date.today - 1 
todaysReport = Report.where(:created_at => today).find_by_user_id(user.id) 

Problemem jest created_at jest datetime, więc nie będzie żadnych sugestii matches..Any ?

+0

postgres na Heroku – Elliot

+1

'Date.today - 1 'oceni do * wczoraj *. Usuń "-1" lub zmień trzy wystąpienia "dzisiaj" na "wczoraj" –

Odpowiedz

20

Prawdopodobnie chcesz coś takiego:

yesterday = Time.now - 1.day 
user = User.find(user_id) 

todaysReport = user.reports.where(["created_at >= ? AND created_at <= ?", yesterday.beginning_of_day, yesterday.end_of_day]) 
+0

To jest rozwiązanie, ale złe ... –

+0

Zaktualizowałem moją odpowiedź. – Dex

+0

hmm ... lepiej :) –

-4

próbowałeś za pomocą #to_datetime, która Rails dodaje do klas Date i Time?

Report.where(:created_at => today.to_datetime).find_by_user_id(user.id) 

Rzeczywiście zaskoczony AR nie radzi sobie z tym za Ciebie.

+0

nie próbowałby dopasować na czas, kiedy próbuję tylko dopasować dzień? – Elliot

+0

Jedynym problemem jest to, że prawdopodobnie chce zakresu, dlatego nie działa. AR nie powinien generować błędu, ponieważ ma go teraz. – Dex

+0

Ach, tak, widzę problem. – d11wtq

5

Należy porównać w zakresie od jednej północy do drugiej. Jest to również dobry kandydat do stworzenia własnej metody klasy dla większej elastyczności.

class Report 
    # All reports created on the specified Date 
    def self.created_on(date) 
    where(['created_at >= ? AND created_at < ?', date, date + 1]) 
    end 
end 

# Find all reports created yesterday by our user 
Report.created_on(Date.today - 1).where(:user_id => user.id) 
+0

Podoba mi się to! Powinienem dodawać początek_of_day i end_of_day do daty var mimo, prawda? – Elliot

+0

@ Elliot: Nie ma potrzeby. Daty zostaną skonwertowane na czasy z częściami czasu ustawionymi na północ za kulisami. –

1

Może to być również TimeWithZone, jeśli strefa czasowa została określona w konfiguracji aplikacji. Aby uzyskać Data na TimeWithZone, musisz zrobić to jak Date.today.to_time.in_time_zone.

Powiązane problemy