परिवर्तन स्तंभ के लिए रेल प्रवास


327

हमारे पास script/generate migration add_fieldname_to_tablename fieldname:datatypeएक मॉडल में नए कॉलम जोड़ने के लिए सिंटैक्स है।

उसी पंक्ति पर, क्या हमारे पास एक कॉलम के डेटाटाइप को बदलने के लिए एक स्क्रिप्ट / जेनरेट है? या मुझे अपने वैनिला प्रवास में सीधे एसक्यूएल लिखना चाहिए?

मैं से एक स्तंभ में परिवर्तन करना चाहते datetimeकरने के लिए date

जवाबों:


548

मुझे लगता है कि यह काम करना चाहिए।

change_column :table_name, :column_name, :date

13
@b_ayan: जहाँ तक मुझे पता है, माइग्रेशन नामों में केवल जादुई शब्द "ऐड" और "रिमूव" हैं।
एलेक्स कोरबान

1
क्रमबद्ध तरह के noob यहाँ, लेकिन ... मैं इस जवाब पर टिप्पणी नहीं बल्कि जवाब समझता हूँ। स्पष्टीकरण की सराहना की :)
एलन एच।

7
जब आप कोई माइग्रेशन बनाते हैं, तो आप इसे एक नाम देते हैं (उदाहरण के लिए add_fieldname_to_tablename उपरोक्त प्रश्न में)। यदि यह "ऐड" या "रिमूव" से शुरू होता है, तो माइग्रेशन कॉलम को जोड़ने या हटाने के लिए कोड के साथ स्वचालित रूप से पॉपुलेट हो जाएगा, जो आपको खुद उस कोड को लिखने से बचाता है।
एलेक्स कोरबन

6
यह भी ध्यान में रखने योग्य है कि आपको सामान्य changeक्रिया को अलग upऔर downकार्यों से बदलना चाहिए , जैसा change_columnकि एक अपरिवर्तनीय प्रवास है और एक त्रुटि उठानी चाहिए जो आपको वापस रोल करने की आवश्यकता है।
डेवस्टेफेंस

1
@QPaysTaxes में वह होना चाहिए जिसमें आप अपने कॉलम को और से बदलना चाहते हैं, और नीचे उस बदलाव को कैसे शामिल किया जाए।
डेवस्टेफेन्स

98

यदि आपके पास तालिका के भीतर बदलने के लिए कई कॉलम हैं, तो आप एक ब्लॉक का भी उपयोग कर सकते हैं।

उदाहरण:

change_table :table_name do |t|
  t.change :column_name, :column_type, {options}
end

देखें टेबल वर्ग पर API दस्तावेज़ अधिक जानकारी के लिए।


88

मुझे यह पता नहीं है कि क्या आप यह सब करने के लिए कमांड लाइन से माइग्रेशन बना सकते हैं, लेकिन आप एक नया माइग्रेशन बना सकते हैं, फिर इस टैक्सेस को करने के लिए माइग्रेशन को एडिट कर सकते हैं।

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

आप इसके साथ एक नया माइग्रेशन बना सकते हैं:

rails g migration change_data_type_for_fieldname

तब बदलाव_ का उपयोग करने के लिए माइग्रेशन संपादित करें:

class ChangeDataTypeForFieldname < ActiveRecord::Migration
  def self.up
    change_table :tablename do |t|
      t.change :fieldname, :date
    end
  end
  def self.down
    change_table :tablename do |t|
      t.change :fieldname, :datetime
    end
  end
end

फिर माइग्रेशन चलाएं:

rake db:migrate

32

जैसा कि मैंने पिछले उत्तरों से पाया, एक कॉलम के प्रकार को बदलने के लिए तीन चरणों की आवश्यकता होती है:

चरण 1:

इस कोड का उपयोग करके एक नई माइग्रेशन फ़ाइल बनाएं:

rails g migration sample_name_change_column_type

चरण 2:

/db/migrateफ़ोल्डर पर जाएं और आपके द्वारा बनाई गई माइग्रेशन फ़ाइल को संपादित करें। दो अलग-अलग समाधान हैं।

  1. def change
        change_column(:table_name, :column_name, :new_type)
    end

2।

    def up
        change_column :table_name, :column_name, :new_type
    end

    def down
        change_column :table_name, :column_name, :old_type
    end

चरण 3:

इस कमांड को करना न भूलें:

rake db:migrate

मैंने रेल 4 के लिए इस समाधान का परीक्षण किया है और यह अच्छी तरह से काम करता है।


1
चरण 2 में, पहली रेक db चलाने के बाद विफल हो जाएगी: रोलबैक, मैं आपको दूसरे की जांच करने की सलाह देता हूं
Feuda

क्या एक रेल सम्मेलन है जो माइग्रेशन फ़ाइल को बिना जाने और उसके संपादन के दौरान सब कुछ कम या ज्यादा करने की अनुमति देता है?
BKSpurgeon

@BKSpurgeon हां, यहां दस्तावेज की जांच करें: edgeguides.rubyonrails.org/active_record_migrations.html
Aboozar Rajabi

12

रेल के साथ ५

से रेल गाइड :

यदि आप कुछ ऐसा करने के लिए माइग्रेशन की इच्छा रखते हैं, जो सक्रिय रिकॉर्ड को उलटना नहीं जानता है, तो आप इसका उपयोग कर सकते हैं reversible:

class ChangeTablenameFieldname < ActiveRecord::Migration[5.1]
  def change
    reversible do |dir|
      change_table :tablename do |t|
        dir.up   { t.change :fieldname, :date }
        dir.down { t.change :fieldname, :datetime }
      end
    end
  end
end

8

बस माइग्रेशन जनरेट करें:

rails g migration change_column_to_new_from_table_name

माइग्रेशन को इस तरह अपडेट करें:

class ClassName < ActiveRecord::Migration
  change_table :table_name do |table|
    table.change :column_name, :data_type
  end
end

और अंत में

rake db:migrate

2

माइग्रेशन का उपयोग करके डेटा प्रकार बदलने का दूसरा तरीका

चरण 1: आपको माइग्रेशन का उपयोग करके फाल्टेड डेटा टाइप फ़ील्ड नाम को हटाने की आवश्यकता है

उदाहरण के लिए:

rails g migration RemoveFieldNameFromTableName field_name:data_type

यहां अपने क्षेत्र के लिए डेटा प्रकार निर्दिष्ट करना न भूलें

चरण 2: अब आप सही डेटा प्रकार के साथ फ़ील्ड जोड़ सकते हैं

उदाहरण के लिए:

rails g migration AddFieldNameToTableName field_name:data_type

यही है, अब आपकी तालिका सही डेटा प्रकार फ़ील्ड के साथ जुड़ जाएगी, हैप्पी रूबी कोडिंग !!


2

यह सब मान रहा है कि कॉलम के डेटाटाइप में किसी भी मौजूदा डेटा के लिए एक अंतर्निहित रूपांतरण है। मैंने कई स्थितियों में भाग लिया है जहाँ मौजूदा डेटा, Stringमान लें कि इसे नए डेटाटाइप में बदला जा सकता है, आइए बताते हैं Date

इस स्थिति में, यह जानना उपयोगी है कि आप डेटा रूपांतरण के साथ माइग्रेशन बना सकते हैं। व्यक्तिगत रूप से, मैं इन्हें अपनी मॉडल फ़ाइल में रखना पसंद करता हूं, और फिर सभी डेटाबेस स्कीमाओं के माइग्रेट होने और स्थिर होने के बाद उन्हें हटा देता हूं।

/app/models/table.rb
  ...
  def string_to_date
    update(new_date_field: date_field.to_date)
  end

  def date_to_string
    update(old_date_field: date_field.to_s)
  end
  ...
    def up
        # Add column to store converted data
        add_column :table_name, :new_date_field, :date
        # Update the all resources
        Table.all.each(&:string_to_date)
        # Remove old column
        remove_column :table_name, :date_field
        # Rename new column
        rename_column :table_name, :new_date_field, :date_field
    end

    # Reversed steps does allow for migration rollback
    def down
        add_column :table_name, :old_date_field, :string
        Table.all.each(&:date_to_string)
        remove_column :table_name, :date_field
        rename_column :table_name, :old_date_field, :date_field
    end

0

डिफ़ॉल्ट मान के संपादन के मामले में जवाब पूरा करने के लिए :

आपके रेल कंसोल में:

rails g migration MigrationName

माइग्रेशन में:

  def change
    change_column :tables, :field_name, :field_type, default: value
  end

ऐसा दिखाई देगा :

  def change
    change_column :members, :approved, :boolean, default: true
  end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.