2012-04-28 16 views
70

ऐसा लगता है कि नए रेल संस्करणों में self.up और self.down विधियों के विरुद्ध "परिवर्तन" है।रेल माइग्रेशन: self.up और self.down बनाम परिवर्तन

तो क्या होता है जब किसी को माइग्रेशन वापस लेना पड़ता है यह कैसे पता चलता है कि कौन से कार्यों को निष्पादित करना है।

class AddImageToUsers < ActiveRecord::Migration 
    def self.up 
    add_column :users, :image_file_name, :string 
    add_column :users, :image_content_type, :string 
    add_column :users, :image_file_size, :integer 
    add_column :users, :image_updated_at, :datetime 
    end 

    def self.down 
    remove_column :users, :image_file_name, :string 
    remove_column :users, :image_content_type, :string 
    remove_column :users, :image_file_size, :integer 
    remove_column :users, :image_updated_at, :datetime 
    end  
end 

मैं कैसे नया परिवर्तन विधि का उपयोग कर एक ही कर सकते हैं: मैं निम्न विधि है कि मैं एक ऑनलाइन ट्यूटोरियल के आधार पर लागू करने की आवश्यकता है?

+2

http://guides.rubyonrails.org/migrations.html#using-the-change-method – Baldrick

उत्तर

96

कई आपरेशनों रेल अनुमान लगा सकते हैं उलटा आपरेशन (समस्याओं के बिना) है क्या के लिए। उदाहरण के लिए, आपके मामले में रोलबैक करते समय कॉल करने के लिए add_column का रिवर्स ऑपरेशन क्या है? बेशक यह remove_column है। create_table के विपरीत क्या है? यह drop_table है। तो इन मामलों में रेलों को पता है कि रोलबैक कैसे करें और down विधि को परिभाषित करना आवश्यक है (आप methods currently supported from the change method दस्तावेज में देख सकते हैं)।

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

जैसा कि कहा गया है, मैं आपको Rails Migrations Guide पढ़ने का सुझाव देता हूं।

1
class AddImageToUsers < ActiveRecord::Migration 
    def change 
    add_column :users, :image_file_name, :string 
    add_column :users, :image_content_type, :string 
    add_column :users, :image_file_size, :integer 
    add_column :users, :image_updated_at, :datetime 
    end 
end 
+0

धन्यवाद। लेकिन अगर आप वापस रोल करना चाहते हैं तो क्या होगा। क्या यह पता चलेगा कि क्या करना है? – banditKing

+3

मैंने overslept। एल्डो 'xoen' Giambelluca सब कुछ समझाओ। –

22

बेहतर उपयोग करने के लिए, नीचे, बदलें:

रेल पर 3 (प्रतिवर्ती): जो अप पर नया स्तंभ जोड़ने और तालिका में सभी रिकॉर्ड केवल पर भरने चाहिए, और केवल इस स्तंभ को हटा

नीचे
def up 
    add_column :users, :location, :string 
    User.update_all(location: 'Minsk') 
end 

def down 
    remove_column :users, :location 
end 

लेकिन पर:

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

def change 
    add_column :users, :location, :string 
end 

पर ऊपर यह तालिका में कॉलम जोड़ सकते हैं और नीचे उस पर निकाल देंगे। बहुत कम कोड और यह एक लाभ है।

रेल 4 पर: एक और उपयोगी तरीका लिखने के लिए क्या हम एक ही स्थान पर की जरूरत है:

def change 
    add_column :users, :location, :string 
    reversible do |direction| 
    direction.up { User.update_all(location: 'Minsk') } 
    end 
end 
+0

अच्छा स्पष्टीकरण ब्रो –

+0

वापस कर रहा है? परिवर्तन के अंदर जा रहे दिशा को बताने का एक अच्छा तरीका भी है – baash05

+0

इनमें से कोई भी काम नहीं करता है। मैं बस 'ActiveRecord :: अपरिवर्तनीय माइग्रेशन' प्राप्त करता रहता हूं। –

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