2016-01-14 19 views
15

Ho questa tabella:cambio di nome della colonna 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 

colonna 'stagione' dovrebbe essere chiamato 'season_id'. So che devo scrivere "t.rename: season,: season_id" come spiegato in http://edgeguides.rubyonrails.org/active_record_migrations.html#column-modifiers ma non riesco a trovare la sintassi corretta. Dovrebbe essere?

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 

Non funziona. Qualcosa che devo fare nella console del Mac? Grazie!

+4

Perché lo si rinomina nella stessa migrazione? O rollback e aggiustarlo in 'create_table', o creare una nuova migrazione. Puoi anche scrivere 'rename_column: shoes,: season,: season_id' invece di metterlo in un blocco. –

+0

Non so bene cosa sto facendo. apprendimento :) ho dimenticato di aggiungere che la tabella contiene dati. creare una nuova migrazione significa un nuovo "cambiamento di colpa"? thx – Pere

+1

Significa una nuova migrazione che ha il proprio metodo 'change'. –

risposta

47

Esegui nella console:

$ rails g migration rename_season_to_season_id 

ora File db/migrate/TIMESTAMP_rename_season_to_season_id.rb contiene i seguenti:

class RenameSeasonToSeasonId < ActiveRecord::Migration 
    def change 
    end 
end 

modificarlo come segue:

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

Quindi eseguire $ rake db:migrate in consolle.

2

O correggere la migrazione e fare

rake db:rollback db:migrate 

o fare un altro la migrazione in questo modo:

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

e poi fare

rake db:migrate 
0

Se la vostra intenzione è quella di rinominare colonna nella tabella di quello che ad esempio la migrazione non è dare un senso:) ... Invece di questo

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 

Hai solo bisogno di migrazione cambiamento tavolo, come questo (Rails si prenderà cura rollback per il vostro):

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

rename metodo su oggetto tabella in Rails è valido metodo, come si può vedere nel codice sorgente Rails

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

Problemi correlati