web-dev-qa-db-fra.com

changer le nom de la colonne

J'ai cette table:

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

la colonne 'saison' devrait s'appeler 'saison_id'. Je sais que je dois écrire 't.rename: season,: season_id' comme expliqué dans http://edgeguides.rubyonrails.org/active_record_migrations.html#column-modifiers mais je ne parviens pas à trouver le bonne syntaxe. Devrait-ce être?

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

Ça ne marche pas Tout ce que je dois faire dans la console Mac? Merci!

19
Pere

Courez dans votre console:

$ Rails g migration rename_season_to_season_id

Maintenant, le fichier db/migrate/TIMESTAMP_rename_season_to_season_id.rb contient les éléments suivants:

class RenameSeasonToSeasonId < ActiveRecord::Migration
  def change
  end
end

Modifiez-le comme suit:

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

Puis lancez $ rake db:migrate dans la console.

56
Inpego

Soit réparer votre migration et faire 

rake db:rollback db:migrate

ou faire une autre migration comme ceci: 

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

et ensuite faire 

rake db:migrate
4
ruby_newbie

Si votre intention est de renommer une colonne dans une table, la migration n’a aucun sens:) ... au lieu de cela

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

Vous avez juste besoin d'une migration de changement de table, comme ceci (Rails se chargera de la restauration):

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

La méthode rename sur l'objet table dans Rails est une méthode valide, comme vous pouvez le voir dans le code source de Rails

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

0
dixpac