2016-01-14 27 views
15

我有这个表:更改列名的Rails

class CreateShoes < ActiveRecord::Migration 
    def change 
    create_table :shoes do |t| 
     t.string :name 
     t.boolean :leather 
     t.integer :season 

     t.timestamps null: false 
    end 
    end 
end 

的 '季节' 一栏被称为 'season_id'。我知道我必须编写't.rename:season,:season_id',如http://edgeguides.rubyonrails.org/active_record_migrations.html#column-modifiers中所解释的,但我无法找到正确的语法。它应该是?

class CreateShoes < ActiveRecord::Migration 
    def change 
    create_table :shoes do |t| 
     t.string :name 
     t.boolean :leather 
     t.integer :season 

     t.timestamps null: false 
    end 

    change_table :products do |t| 
     t.rename :season, :season_id 
    end 

    end 
end 

不起作用。我需要在Mac控制台中做什么?谢谢!

+4

你为什么要在同一迁移中重命名它?回滚并将其修复到'create_table'中,或者创建一个新的迁移。你也可以直接写'rename_column:shoes,season,season_id',而不是把它放在一个块中。 –

+0

我不知道我在做什么。学习:)忘了补充表中有数据。创造新的迁移意味着新的“变化”? thx – Pere

+1

这意味着有一个新的迁移,它有自己的'change'方法。 –

回答

47

运行在控制台:

$ rails g migration rename_season_to_season_id 

现在文件db/migrate/TIMESTAMP_rename_season_to_season_id.rb包含以下内容:

class RenameSeasonToSeasonId < ActiveRecord::Migration 
    def change 
    end 
end 

将其修改为:

class RenameSeasonToSeasonId < ActiveRecord::Migration 
    def change 
    rename_column :shoes, :season, :season_id 
    end 
end 

然后在控制台中运行$ rake db:migrate

2

无论哪种解决您的迁移做

rake db:rollback db:migrate 

,或进行另一个迁移,像这样:

rename_column :shoes, :season, :season_id if column_exists?(:shoes, :season) && !column_exists?(:shoes, :season_id) 

,然后做

rake db:migrate 
0

如果你的意图是比你例子迁移不决策意识重命名表列:)......取而代之的是

class CreateShoes < ActiveRecord::Migration 
    def change 
    create_table :shoes do |t| 
     t.string :name 
     t.boolean :leather 
     t.integer :season 

     t.timestamps null: false 
    end 

    change_table :products do |t| 
     t.rename :season, :season_id 
    end 

    end 
end 

你只需要表变更迁移,像这样(Rails会照顾回滚您):

class RenameSessionColumnInsideShoes < ActiveRecord::Migration 
    def change 
    change_table :products do |t| 
     t.rename :season, :season_id 
    end 
    end 
end 

rename表对象的方法在Rails是有效的方法,你可以在Rails的源代码中看到

https://github.com/rails/rails/blob/master/activerecord/lib/active_record/connection_adapters/abstract/schema_definitions.rb#L582