2012-02-10 13 views
11

रेल का :timestamp कॉलम प्रकार का उपयोग करना है; यह वास्तव में :datetime के लिए सिर्फ एक उपनाम है।ActiveRecord/Rails को वास्तविक mysql TIMESTAMP कॉलम

मैं mysql का उपयोग कर रहा हूं, और मैं वास्तविक यूनिक्स-टाइमस्टैम्प TIMESTAMP कॉलम का उपयोग करना चाहता हूं।

ए) एसक्यूएल का उपयोग करके कॉलम बनाने के अलावा, इसे सेट करने का कोई अच्छा तरीका है?

बी) क्या ActiveRecord ठीक से इसका सामना करेगा (उदाहरण के लिए Time में कनवर्ट करना, यूनिक्स टाइमस्टैम्प Integer इनपुट के रूप में स्वीकार करना आदि)? मुझे किस चीज को संभालने की उम्मीद करनी चाहिए, और कहां?

क्यों:

  1. स्पीड। यह एक बेहद सक्रिय तालिका के लिए है जो बाहरी डेटा स्रोतों को एकत्रित कर रहा है जो पहले से ही यूनिक्स टाइमस्टैम्प का उपयोग कर रहे हैं। डेटाटाइम में कनवर्ट करना (या पहले डीबी स्ट्रिंग में कनवर्ट करना, जो 2 gsub एस के माध्यम से जाता है) इसके अधिकांश आयात समय का उपयोग करता है। मैं अन्यथा सिर्फ एक गंदगी सस्ते कर सकता हूं Integer#to_s कॉल।

  2. टाइमज़ोन। मैं नहीं चाहता मैं इसे टाइमज़ोन-अज्ञात रूप से संग्रहीत करना चाहता हूं; टाइमज़ोन से निपटना एक दर्द है और व्यक्तिगत प्रयोक्ता डिस्प्ले से पहले अंतिम चरण को छोड़कर मेरी जरूरतों के लिए पूरी तरह से अप्रासंगिक है। डेटा को स्वयं को जानने की आवश्यकता नहीं है कि यह किस समय क्षेत्र में दर्ज किया गया था।

  3. आकार। यह एक बड़ी मेज है। TIMESTAMP is half the size of DATETIME.

हाँ, मैं अभी भी कोड में updated_at गणना, MySQL नहीं कर रहे होते। वह हिस्सा एक बाधा नहीं है।

क्यों अपने 'क्यों नहीं' गलत है (preemptively, दिखाने के लिए मैं noobish कारणों के लिए पूछ नहीं कर रहा हूँ :-P):

  1. "लेकिन TIMESTAMP स्वत: अद्यतन": That's only true by default, and can be easily switched off.
  2. मैं असल में रेल का उपयोग नहीं करते, केवल ActiveRecord।
  3. हां, यह actual profiling data पर आधारित है; मैं जल्दी अनुकूलन नहीं कर रहा हूँ। ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter#quote (Quoting#quoted_date में [यदि Time गुजर रहा है] या Mysql2Adapter#quote_string [यदि to_s(:db) प्रीकॉन्वर्टर करना) वास्तव में मेरे स्क्रैपर का सबसे अधिक CPU उपभोग करने वाला अनुभाग है। मैं इसे से छुटकारा पाना चाहता हूँ।
+0

यह क्यों कोई फर्क होगा (# 2)? (मैं रेल का उपयोग कर रहा हूं, लेकिन अंतरिक्ष बचाने के लिए टाइमस्टैम्प का उपयोग करने पर विचार कर रहा हूं।) –

उत्तर

0

मैं बहुत नोबिश हूं, लेकिन मैं इसे एक शॉट दूंगा। क्या होगा यदि आप अपना खुद का कस्टम कॉलम जोड़ना चाहते हैं, या डिफ़ॉल्ट वाले को ओवरराइट करना चाहते हैं? अपने तर्क

def mysql_timestamp 
    Time.now.strftime("%Y-%m-%d %H:%M:%S") 
end 

ख के बारे में सुनिश्चित नहीं हैं) में

t.add_column :mysql_timestamp, 'timestamp' 

और फिर कहीं और: तुम कितने तरह एक तार के साथ कस्टम डेटा प्रकार का उपयोग कर सकते हैं। पता लगाने के लिए केवल एक ही तरीका है!

+0

'टाइमस्टैम्प' कॉलम प्रकार TIMESTAMP नहीं है, यह DATETIME है। – Sai

+1

केवल जब यह प्रतीक है। यदि आप एक स्ट्रिंग का उपयोग करते हैं तो यह हो सकता है कि आप जो कुछ भी चाहते हैं, कम से कम, इस पोस्ट में @tadman के अनुसार http://stackoverflow.com/questions/4100209/ruby-rails-active-record-db- माइग्रेशन-to -mysql-timestamp-type # 4100341 मैंने हालांकि कोशिश नहीं की है। –

+0

@protolif वर्णित की तरह काम नहीं कर रहा है। – aTei

7

इस काम करता है (परिभाषा टाइप करने के लिए हाल ही में जोड़े खाली स्थान के चरित्र है, तो: टाइमस्टैम्प यह हावी नहीं होता): अगर आप रेल का उपयोग कर रहे

 t.add_column :sometable, :created_at, 'timestamp ' 
संबंधित मुद्दे