आपका डेटाबेस यूटीसी में आपके टाइमस्टैम्प को संग्रहीत कर रहा है (जैसा कि इसे करना चाहिए)। ActiveRecord टाइमज़ोन समायोजन कर रहा है जब यह जानता है कि इसमें टाइमस्टैम्प है; इसलिए, जब आप यह कहते हैं:
puts Activity.first.starting_at
एआर जानता है कि starting_at
एक टाइमस्टैम्प है इसलिए यह टाइमस्टैम्प को ActiveSupport::TimeWithZone
के रूप में इंस्टेंट करता है।
उदाहरण और वह वर्ग टाइमज़ोन समायोजन लागू करता है। लेकिन, जब आप यह कहते हैं:
select("date_trunc('day', activities.starting_at) as date ...
AR यह पता लगाने के लिए SQL को पार्स नहीं करेगा कि date_trunc
टाइमस्टैम्प लौटाएगा, एआर को यह भी नहीं पता कि date_trunc
. क्या है साधन। एआर डेटाबेस से बाहर आने वाली एक स्ट्रिंग को देखेगा और यह बिना किसी व्याख्या के आपको सौंप देगा। आप उस स्ट्रिंग को ActiveSupport::TimeWithZone
. पर फीड करने के लिए स्वतंत्र हैं (या आपकी पसंदीदा टाइम हैंडलिंग क्लास) स्वयं:एआर को ऐसी बातें बताने में कुछ भी गलत नहीं है जो वह अपने आप नहीं जानता और न ही जान सकता है।
रेल चालाक है लेकिन यह जादू नहीं है।