Изменить имя столбца 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? Спасибо!

Ответы

Ответ 1

Запустите в консоли:

$ 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)

а затем do

rake db:migrate

Ответ 3

Если вы намерены переименовать столбец в таблице, чем вы, например, миграция не имеет смысла:)... Вместо этого

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