1

嗨,我创建了一个 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 时,什么都没有发生。如何完成这项任务。我也想从这个迁移文件中更改已经创建的模型。嗯,正在寻找一种方法来做到这一点。先感谢您

4

5 回答 5

6

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

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

请注意,您的upanddown方法应该是有效的。rake db:migrate:down调用和时,您应该能够从一个转到另一个rake db:migrate:up。这不是这里的情况。

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

请阅读此处了解更多详情

您最终会得到 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
于 2013-07-31T10:03:46.513 回答
2

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

于 2013-07-31T10:07:29.287 回答
1

因为这个迁移已经执行了。您必须生成一个新的迁移以在表中添加和删除列,即您要从表中删除 file_name :

运行这个:

rails g migration RemoveFileNameFromCreateMt940Batches file_name:string

重新生成该列:

rails g migration AddFileNameToCreateMt940Batches file_name:string

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

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

于 2013-07-31T10:05:59.313 回答
1

使用已删除的列列表创建另一个迁移文件

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=<your migration file version>

并更改迁移文件然后运行

db:migrate:up version=<your migration file version>
于 2013-07-31T10:06:25.740 回答
0

如果除了已经存在的少数之外,您必须一次删除太多,那么一个小循环将有所帮助:

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

于 2015-06-11T13:07:18.873 回答