2016-03-22 15 views
5

Không phải là tự tin khi nói đến sử dụng các múi giờ, tìm kiếm một số giúp đỡ về vấn đề này mộtray // truy vấn bằng cách múi giờ vào ban ngày

Tôi có một công việc định kỳ kiểm tra mà người dùng mỗi một lần trong một thời gian, mà gọi một cào bài tập. Trong nhiệm vụ rake này, tôi truy vấn người dùng và gửi từng cơ sở email về điều kiện.

Tôi có thông tin múi giờ cho từng người dùng. Tôi muốn có một truy vấn về những người dùng đó sẽ chỉ trả lại những người dùng hiện đang ở vào ban ngày của họ

Làm cách nào để đạt được điều đó?

Tốt nhất

+0

Sử dụng phương thức in_time_zone của lớp DateTime như sau: 'Object.created_at.in_time_zone ('Eastern Time (US)')' và sau đó bạn có thể kiểm tra đối tượng datetime này (9 ... 5) kiểm tra thời gian trong ngày. –

Trả lời

3

Điều này phụ thuộc vào một vài điều khác nhau, nhưng tôi sẽ đi theo cách thiết lập trang web của tôi. Mô hình người dùng của tôi có cột có tên múi giờ, ví dụ về cách múi giờ được lưu trữ trong cột đó sẽ là: "Hoa Kỳ/Trung tâm"

Tôi sẽ thực hiện việc này bằng cách đặt cùng một loạt các tên múi giờ hiện đang trong khoảng thời gian nhất định, sau đó truy vấn bảng Người dùng.

zones = ActiveSupport::TimeZone.zones_map.values. 
    map { |z| z.name if (8..20).cover?(z.now.hour) }.compact 
users = User.where(timezone: zones) 

Phần 'zones_map.values' sẽ kéo lại một danh sách tất cả các múi giờ, sau đó chúng tôi lập bản đồ họ chỉ trả lại tên của những người mà hiện đang có một giờ mà là giữa 08:00 (8) và 8:00 (20). Sau đó chúng tôi sử dụng mảng được trả về bởi bản đồ trong truy vấn cho người dùng.

Vì vậy, 'z.now' sẽ cung cấp cho chúng tôi thời gian hiện tại trong múi giờ đó và chúng tôi sử dụng '(8..20) .cover?' để xem nếu 'z.now.hour' là từ 8 đến 20.

Giờ ** trên 12 sẽ không reset là 1, nhưng thay vì tiếp tục như 13, 14 vv

Không chắc nếu có một cách nhanh hơn/hiệu quả hơn, nhưng đây là cách tôi đã tìm thấy nó vẫn là một truy vấn và tránh lặp qua tất cả người dùng.

+0

Đẹp nhất! Còn phiên bản rails5 thì sao? – Ben

+0

Chắc chắn, phiên bản Rails 5 thực sự là một cách tốt hơn để làm điều đó: sử dụng --- ActiveSupport :: TimeZone.all --- thay vì --- ActiveSupport :: TimeZone.zones_map.values ​​--- Cũng hoạt động trong Rails 4 . – MTarantini

Các vấn đề liên quan