更改列名称Rails

Per*_*ere 22 database ruby-on-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
Run Code Online (Sandbox Code Playgroud)

'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
Run Code Online (Sandbox Code Playgroud)

不行.我在Mac控制台中需要做什么?谢谢!

Inp*_*ego 62

在您的控制台中运行:

$ rails g migration rename_season_to_season_id
Run Code Online (Sandbox Code Playgroud)

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

class RenameSeasonToSeasonId < ActiveRecord::Migration
  def change
  end
end
Run Code Online (Sandbox Code Playgroud)

修改如下:

class RenameSeasonToSeasonId < ActiveRecord::Migration
  def change
    rename_column :shoes, :season, :season_id
  end
end
Run Code Online (Sandbox Code Playgroud)

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


rub*_*bie 5

要么修复你的迁移并执行

rake db:rollback db:migrate
Run Code Online (Sandbox Code Playgroud)

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

rename_column :shoes, :season, :season_id if column_exists?(:shoes, :season) && !column_exists?(:shoes, :season_id)
Run Code Online (Sandbox Code Playgroud)

然后做

rake db:migrate
Run Code Online (Sandbox Code Playgroud)