2011-07-03 51 views
13

Vì vậy, tôi đang cố gắng để làm những việc như vậy:So sánh một ngày đến Datetime created_at trong rails3

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

Vấn đề là created_at là một datetime, vì vậy nó sẽ không tìm thấy bất cứ đề nghị matches..Any ?

+0

postgres trên Heroku – Elliot

+1

'Date.today - 1' sẽ đánh giá để * hôm qua *. Loại bỏ các '-1' hoặc thay đổi ba trường hợp của" ngày hôm nay "để" ngày hôm qua " –

Trả lời

20

Bạn có thể muốn một cái gì đó như thế này:

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

một giải pháp của nó nhưng một xấu ... –

+0

Tôi đã cập nhật câu trả lời của tôi. – Dex

+0

hmm ... tốt hơn :) –

-4

Bạn đã cố gắng sử dụng #to_datetime, mà Rails thêm vào DateTime lớp học?

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

AR thật sự ngạc nhiên không xử lý điều này cho bạn.

+0

nó sẽ không cố gắng để phù hợp vào một thời điểm khi tôi chỉ cố gắng để phù hợp với ngày? – Elliot

+0

Vấn đề duy nhất với điều này là anh ta thực sự muốn có một phạm vi, đó là lý do tại sao nó không hoạt động. AR không nên tạo ra lỗi khi anh ta có nó ngay bây giờ. – Dex

+0

Ah, vâng, tôi thấy vấn đề. – d11wtq

5

Bạn cần phải so sánh với phạm vi từ một nửa đêm đến ngày tiếp theo. Ngoài ra, đây là một ứng cử viên tốt để làm cho phương pháp lớp học của riêng bạn cho tính linh hoạt cao hơn.

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

Tôi thích điều này! Tôi nên thêm start_of_day và end_of_day vào ngày var mặc dù phải không? – Elliot

+0

@Elliot: Không cần. Các ngày sẽ được chuyển đổi thành thời gian biểu với phần thời gian được đặt thành nửa đêm sau hậu trường. –

1

Cũng có thể là TimeWithZone nếu múi giờ được chỉ định trong cấu hình ứng dụng. Để có được Date to TimeWithZone bạn phải làm như Date.today.to_time.in_time_zone.