रेल माइग्रेशन: स्व.अप और स्व.डाउन बनाम परिवर्तन


86

ऐसा लगता है कि नई रेल के संस्करण में "परिवर्तन" बनाम स्व.अप और सेल्फडाउन विधियां हैं।

तो क्या होता है जब किसी को माइग्रेशन वापस करना होता है, उसे यह कैसे पता होता है कि क्या कार्रवाई करनी है। मेरे पास एक ऑनलाइन ट्यूटोरियल के आधार पर निम्नलिखित विधि है जिसे मुझे लागू करने की आवश्यकता है:

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

मैं नए बदलाव के तरीके का उपयोग कैसे कर सकता हूं?


जवाबों:


110

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

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

जैसा कि कहा गया है, मैं आपको रेल माइग्रेशन गाइड पढ़ने के लिए सुझाव देता हूं ।


33

ऊपर, नीचे, परिवर्तन का उपयोग करने के लिए बेहतर है:

रेल 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

अच्छा विवरण भाई
बिबेक शर्मा

वापस लाने में? दिशा बदलने के लिए आप जिस दिशा में जा रहे हैं उसे बताने का एक अच्छा तरीका है
baash05

इनमें से कोई भी काम नहीं करता है। मैं बस मिलता रहा ActiveRecord::IrreversibleMigration
थ्रू अवे अकाउंट

ऐसी स्थितियाँ हैं जहाँ रेल रोलबैक माइग्रेशन में विफल होती हैं। कृपया उनकी मदद देखें
कलीम उल्ला

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

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

3
मैं ज्यादा देर तक सोई। एल्डो 'xoen' Giambelluca सब कुछ समझाता है।
कुछ भी नहीं-विशेष-यहाँ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.