2012-05-24 4 views
6

Tôi muốn tạo một dãy số mục được tạo mỗi giờ, mỗi ngày.đường ray - nhóm theo ngày cũng như giờ

Tôi đang theo dõi cách mọi người đang cảm thấy, vì vậy mô hình của tôi được gọi là TrackMood Nó chỉ có một cột được gọi là mood và dấu thời gian.

Nếu tôi làm

TrackMood.where(mood: "good").group("hour(created_at)").count 

tôi nhận được một cái gì đó giống như {11 => 4, 12 => 2, 13 => 2, 15 => 1}

Tôi đã có 2 vấn đề ở đây

1 Làm thế nào để thêm ngày vào điều này để nó không chỉ thêm các mục tạo ra ngày hôm qua lúc 11 giờ đến các mặt hàng được thêm vào ngày hôm nay lúc 11 giờ?

2 Làm thế nào để đảm bảo rằng nó nói 0 cho giờ khi không có gì được tạo?

Trả lời

9

1) Thay vì chỉ nhóm vào phần giờ của ngày bạn cần nhóm một phần của ngày có liên quan, tức là ngày lên đến giờ và không bao gồm bất kỳ điều gì cụ thể hơn. Ví dụ.

TrackMood.where(mood: "good").group("date_format(created_at, '%Y%m%d %H')").count 

2) Bạn sẽ luôn nhận được băm từ cuộc gọi này ngay cả khi không tìm thấy nhóm nào. Nếu bạn muốn kiểm tra số lượng nhóm, bạn có thể gọi số .size hoặc .count trên đó.

+0

Brilliant cho q 1. Đối với phần thứ hai, tôi không thể đã thực hiện bản thân mình rõ ràng. Tôi muốn 14 => 0 để được băm nếu không có mục nào được tạo trong giờ đó. – Edward

+0

Ah xin lỗi, được rồi, tôi hiểu ngay bây giờ. Thành thật mà nói, có lẽ bạn nên thêm vào các nhóm trống sau đó sử dụng ruby ​​thay vì yêu cầu lớp kiên trì cung cấp chúng. – Shadwell