【问题标题】:Ruby on rails How to remove added columns and insert new columns through a migration fileRuby on rails 如何通过迁移文件删除添加的列并插入新列
【发布时间】:2013-07-31 09:59:59
【问题描述】:

您好,我创建了一个 Ruby on rails 迁移文件,如下所示,在第一阶段我创建了表

然后我想添加列并删除一些列,我修改如下

class CreateMt940Batches < ActiveRecord::Migration
  def change
    create_table :mt940_batches do |t|
     t.string :account_number
     t.string :transaction_reference_number
     t.string :information_to_account_owner
     t.string :file_name
     t.binary :raw_data_transaction
     t.string :sha1_checksum
     t.timestamps
   end

   def self.down
     remove_column :account_number, :transaction_reference_number, :information_to_account_owner
   end

   def self.up
     add_column :mt940_batches, :created_by, :updated_by, :integer
   end 
 end
  end

但是当我运行 rake db:migrate 时,什么也没发生。如何完成这项任务。我也想从这个迁移文件中更改已经创建的模型。嗯,正在寻找一种方法来做到这一点。提前谢谢你

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

    您应该在单独的迁移文件中添加您的删除/添加列。

    class FooMigration < ActiveRecord::Migration
      def down
        remove_column :account_number, :transaction_reference_number, :information_to_account_owner
      end
    
      def up
        add_column :mt940_batches, :created_by, :updated_by, :integer
      end 
    end
    

    请注意,您的 updown 方法应具有同等效力。调用rake db:migrate:downrake db:migrate:up 时,您应该能够从一个转到另一个。这不是这里的情况。

    但是在这里,您似乎希望在一次迁移中实现 2 个不同的目标。如果要添加和删除列,请考虑将每一列移到不同的迁移文件中:

    请阅读here了解更多详情

    你最终会得到 2 个这样的迁移文件:

    class RemoveFieldsFromMt940Batches < ActiveRecord::Migration
      def change
        remove_column :mt940_batches, :account_number, :transaction_reference_number, :information_to_account_owner
      end
    end
    
    class AddFieldsToMt940Batches < ActiveRecord::Migration
      def change
        add_column :mt940_batches, :created_by, :updated_by, :integer
      end
    end
    

    【讨论】:

      【解决方案2】:

      如果此迁移已在生产环境中执行,请不要编辑它,而是创建新的 如果没有,你可以使用 rake db:rollback, rollback migrations

      【讨论】:

        【解决方案3】:

        因为此迁移已执行。你必须生成一个新的迁移来在你的表中添加和删除列,即你想从你的表中删除 file_name :

        运行这个:

        rails g migration RemoveFileNameFromCreateMt940Batches file_name:string
        

        重新生成该列:

        rails g migration AddFileNameToCreateMt940Batches file_name:string
        

        比运行rake db:migrate 它将删除列并再次将列添加到您的表中。

        希望它会有所帮助。谢谢。

        【讨论】:

          【解决方案4】:

          创建另一个移除列列表的迁移文件

          def change
          remove_column :account_number, :transaction_reference_number, :information_to_account_owner
          end
          

          创建一个添加了列列表的迁移文件

          def change
          add_column :mt940_batches, :created_by, :updated_by, :integer
          end
          

          不要更改创建表迁移文件。其他明智的data saved in the file will be lost.

          如果data lost 对您不重要,那么只需使用 rake db:migrate:down version=&lt;your migration file version&gt; 删除表格

          并更改迁移文件 然后运行

          db:migrate:up version=<your migration file version>
          

          【讨论】:

            【解决方案5】:

            如果有太多你必须一次删除,除了少数已经在那里,一个小循环会有所帮助:

            https://gist.github.com/dhirajbajaj/fadc81d30f1dad3b518b

            【讨论】:

              猜你喜欢
              • 2013-05-03
              • 1970-01-01
              • 2015-08-12
              • 2013-10-10
              • 2012-03-06
              • 1970-01-01
              • 1970-01-01
              • 2012-12-24
              • 1970-01-01
              相关资源
              最近更新 更多