Cơ sở dữ liệu của bạn đang lưu trữ dấu thời gian của bạn ở UTC (nếu cần). ActiveRecord đang thực hiện điều chỉnh múi giờ khi biết rằng nó có dấu thời gian; vì vậy, khi bạn nói điều này:
puts Activity.first.starting_at
AR biết rằng starting_at
là dấu thời gian nên nó khởi tạo dấu thời gian dưới dạng ActiveSupport::TimeWithZone
cá thể và lớp đó áp dụng điều chỉnh múi giờ. Nhưng, khi bạn nói điều này:
select("date_trunc('day', activities.starting_at) as date ...
AR sẽ không phân tích cú pháp SQL để tìm ra date_trunc
sẽ trả về dấu thời gian, AR thậm chí không biết date_trunc
là gì có nghĩa. AR sẽ chỉ thấy một chuỗi xuất hiện từ cơ sở dữ liệu và nó sẽ giao nó cho bạn mà không cần diễn giải. Bạn có thể tự do cấp chuỗi đó cho ActiveSupport::TimeWithZone
(hoặc lớp xử lý thời gian yêu thích của bạn):không có gì sai khi nói với AR những điều mà nó không và không thể tự biết.
Đường ray rất thông minh nhưng nó không phải là ma thuật.