it-swarm.com.de

spaltennamen ändern Rails

Ich habe diese Tabelle:

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

die Spalte 'season' sollte 'season_id' heißen. Ich weiß, dass ich 't.rename: season,: season_id' schreiben muss, wie in http://edgeguides.rubyonrails.org/active_record_migrations.html#column-modifiers beschrieben aber ich schaffe es nicht richtige Syntax. Sollte es sein?

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

Funktioniert nicht Was muss ich in der Mac-Konsole tun? Vielen Dank!

19
Pere

Führen Sie in Ihrer Konsole aus:

$ Rails g migration rename_season_to_season_id

Die Datei db/migrate/TIMESTAMP_rename_season_to_season_id.rb enthält jetzt Folgendes:

class RenameSeasonToSeasonId < ActiveRecord::Migration
  def change
  end
end

Ändern Sie es wie folgt:

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

Führen Sie dann $ rake db:migrate in der Konsole aus.

56
Inpego

Beheben Sie die Migration und führen Sie sie aus 

rake db:rollback db:migrate

oder machen Sie eine andere Migration wie folgt: 

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

und dann tun 

rake db:migrate
4
ruby_newbie

Wenn Sie die Spalte in der Tabelle umbenennen möchten, ist die Migration nicht sinnvoll:) ... Stattdessen

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

Sie brauchen nur eine Tabellenwechselmigration wie folgt (Rails kümmert sich um Ihr Rollback):

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

Die rename-Methode für ein Tabellenobjekt in Rails ist eine gültige Methode, wie Sie im Rails-Quellcode sehen können

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

0
dixpac