更改列名称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’专栏应该叫’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控制台做什么? 谢谢!

在您的控制台中运行:

 $ 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

要么修复迁移,要么修复

 rake db:rollback db:migrate 

或者像这样进行另一次迁移:

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

然后呢

 rake db:migrate 

如果您打算重命名表中的列而不是示例迁移没有意义:)…而不是这个

 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 

在rails中的表对象上rename方法是有效的方法,正如您在Rails源代码中看到的那样

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