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