2010-04-11 12 views
15

बनाना मैं सोच रहा हूं कि मैं रेक माइग्रेशन फ़ाइल के भीतर उपयोग करने के लिए एक कस्टम डेटा प्रकार कैसे बना सकता हूं। उदाहरण: यदि आप एक मॉडल बनायेंगे, तो माइग्रेशन फ़ाइल के अंदर आप कॉलम जोड़ सकते हैं। यह ऐसा दिखाई दे सकता:रेल: कस्टम डेटा प्रकार बनाना/शॉर्टेंड

def self.up 
    create_table :products do |t| 
     t.column :name, :string 
     t.timestamps 
    end 
    end 

मुझे पता है कि कुछ इस तरह बनाने के लिए कैसे करना चाहते हैं:

t.column :name, :my_custom_data_type 

इस के लिए उदाहरण के लिए बनाने के लिए एक "मुद्रा" प्रकार कारण है, जो ज्यादा कुछ नहीं है 8 की सटीकता और 2 के पैमाने के साथ एक दशमलव से। क्योंकि मैं केवल MySQL का उपयोग करता हूं, इस डेटाबेस के लिए समाधान पर्याप्त है।

आपकी प्रतिक्रिया और टिप्पणियों के लिए धन्यवाद!

+0

मुद्रा के लिए फ़्लोटिंग पॉइंट डेटा प्रकारों का उपयोग करना आम तौर पर एक भयानक विचार है। –

+0

यदि आपके पास बेहतर समाधान है, तो कृपया विस्तृत करें। – Shyam

+1

मनी मणि, http://money.rubyforge.org/ जैसे कुछ का उपयोग करें। – theIV

उत्तर

21

जो आप करना चाहते हैं वह एक नया कॉलम निर्माण विधि परिभाषित करता है जो आपके कस्टम प्रकार को बनाने के विकल्प प्रदान करता है। माइग्रेशन में जैसे व्यवहार को जोड़कर अनिवार्य रूप से किया जाता है। चाल यह पता लगा रही है कि उस कोड को कहां जोड़ना है।

कुछ जहाँ आपके initializers निर्देशिका जगह कोड के इस स्निपेट में:

module ActiveRecord::ConnectionAdapters 
    class TableDefinition 
    def currency (*args) 
     options = args.extract_options! 
     column_names = args 
     options[:precision] ||= 8 
     options[:scale] ||= 2 
     column_names.each { |name| column(name, 'decimal', options) } 
    end                  
    end 
end 

अब आप मुद्रा विधि का उपयोग कर सकते हैं एक मुद्रा स्तंभ किसी भी समय आप इसकी आवश्यकता को परिभाषित करते हैं।

उदाहरण:

def self.up 
    create_table :products do |t| 
    t.currency :cost 
    t.timestamps 
    end 
end 

एक मौजूदा टेबल में एक मुद्रा स्तंभ जोड़ने के लिए:

def self.up 
    change_table :products do |t| 
    t.currency :sell_price 
    end 
end 

चेतावनी: मैं इसे परीक्षण करने के लिए समय नहीं है, तो कोई गारंटी नहीं है। यदि यह काम नहीं करता है, तो इसे कम से कम आपको सही रास्ते पर रखना चाहिए।

+0

मैं इसे अभी परीक्षण करने जा रहा हूं। प्रयास और आपकी मदद के लिए धन्यवाद! – Shyam

+0

धन्यवाद, मैंने इसके लिए अभी उपयोग किया था। ध्यान देने योग्य एक बात: 't'' create_table' में 'tableDefinition' है, लेकिन 'change_table' में' तालिका' है। मैंने अपनी कस्टम पीढ़ी कोड को एक मॉड्यूल में रखा और उन दोनों वर्गों में शामिल किया। – Kolja

+0

हाय @emfi यह वास्तव में अच्छा है .. क्या मॉडल मॉडल होने की तरह इसे आगे बढ़ाने का कोई तरीका है? बस एक विचार क्योंकि मैं उदाहरण के लिए चाहता हूँ एक ही स्थान पर मुद्रा इनपुट सत्यापन के लिए भी..मैं यह भी देखूंगा..धन – sethi

संबंधित मुद्दे