2011-02-09 11 views
18

में क्रमबद्ध कॉलम के लिए डिफ़ॉल्ट है, इसलिए मेरे पास एक क्रमबद्ध कॉलम है: आयाम, और मेरे माइग्रेशन में, मैं फ़ील्ड को डिफ़ॉल्ट हैश होने के लिए सेट करना चाहता हूं।सक्रियरेकॉर्ड माइग्रेशन

मैं कोशिश की है ...

create_table :shipping_profiles do |t| 
     t.string  :dimensions_in, :default => {:width => 0, :height => 0, :depth => 0} 

और बस

t.string :dimensions_in, :default => Hash.new() 

लेकिन खेतों अशक्त अंत। मैं इस क्षेत्र के लिए सृजन पर एक डिफ़ॉल्ट धारावाहिक वस्तु कैसे सेट कर सकता हूं, या कम से कम सुनिश्चित कर सकता हूं कि मेरी धारावाहिक विशेषता हमेशा हैश है?

उत्तर

33

जब रेल डीबी में सहेजने के लिए हैश को क्रमबद्ध करता है, तो यह सब इसे वाईएएमएल में परिवर्तित कर देता है ताकि इसे स्ट्रिंग के रूप में संग्रहीत किया जा सके। इस प्रवास में काम करने के लिए प्राप्त करने के लिए, तुम सब करने की जरूरत है YAML को हैश कन्वर्ट है ...

t.string :dimensions_in, :default => {:width => 0, :height => 0, :depth => 0}.to_yaml 

या, वैकल्पिक रूप से, प्रारंभ के बाद मॉडल में सेट ...

class ShippingProfile < ActiveRecord::Base 

    after_initialize :set_default_dimensions 

    private 

    def set_default_dimensions 
     self.dimensions_in ||= {:width => 0, :height => 0, :depth => 0} 
    end 

end 
+0

after_initialize एक महान समाधान है! धन्यवाद! – brewster

+3

माइग्रेशन में यामल चाल के बारे में जानना बहुत अच्छा है, धन्यवाद! – opsb

+0

महान उत्तर ... – dastanko

4

मैंने इस कोड की कोशिश की और यह मेरे लिए काम किया। यह ActiveRecord गतिशील रूप से तालिका कॉलम में सिंक किए गए मॉडल विधियों को भेजता है जिस तरह से इसका लाभ उठाता है।

class MyModel < ActiveRecord::Base 

    def dimensions_in 
    attributes["dimensions_in"] ||= {:width => 0, :height => 0, :depth => 0} 
    end 

end 
+0

बढ़िया! माइग्रेशन –

+0

में डिफॉल्ट निर्दिष्ट किए बिना डिफ़ॉल्ट मान के रूप में उपयोग किया जा सकता है, यह गुणों के साथ काम नहीं करता है, जैसे 'serialize: dimensions_in, हैश' जैसा कि विशेषता ऑब्जेक्ट प्रकार के रूप में वापस आती है और इस प्रकार "मौजूद" है। आपको कुछ विशेषताओं जैसे 'गुण [' आयाम_इन '] करना होगा। वर्तमान? ? विशेषताएं ['dimensions_in']: {चौड़ाई: 0, ऊंचाई: 0, गहराई: 0} ' –

+0

अभी भी रेल 2 पर;), इस – CodeGroover

7

आप धारावाहिक कॉलम के लिए डिफ़ॉल्ट श्रेणी भी निर्दिष्ट कर सकते हैं। the docs देखें।

class MyModel < ActiveRecord::Base 
    serialize :dimensions_in, Hash 
end 

मैंने पाया after_initialize ब्लॉक एक विशाल प्रदर्शन मारा पैदा कर सकता है कि, विशेष रूप से अगर तुम कभी MyModel.all करने की आवश्यकता होगी (जैसे: एक थोक निर्यात के लिए)

वर्ग के बिना: MyModel.new.dimensions_in => nil

एक डिफ़ॉल्ट हैश वर्ग के साथ: MyModel.new.dimensions_in => {}

+2

के लिए धन्यवाद, लेकिन इस विधि के माध्यम से डिफ़ॉल्ट मान कैसे पास करें? –

+0

@ZuhaibAli दस्तावेज़ों से: "उस विशेषता के लिए डिफ़ॉल्ट मान उस वर्ग का एक नया उदाहरण होगा।" तो इस विधि के साथ यह केवल एक नया उदाहरण है और कुछ कस्टम नहीं हो सकता है। –

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