1

皆さん、私が最初に Rails プロジェクトを開始したとき、モデル ユーザーは設計および作成されていました。すべての移行部分の後、postgres にテーブル "users" が正常に作成されました。さて、プロジェクト中にいくつかの変更を行った後、テーブルに属性/新しい列が欠落していることに気付きました。

そこで、postgres からテーブル users を削除し、最初の移行 Ruby クラスに新しい列を追加しました。

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.string :name
      t.string :password
      t.string :email
      t.string :authorization_token //this is the new attribute that I insert
      t.datetime :created_at
      t.datetime :updated_at

      t.timestamps
    end
  end

  def self.down
    drop_table :users
  end
end

そのため、新しい属性 :authorization_token を使用して新しいユーザー テーブルが作成されるように db:migrate ホッピングを再度実行すると、機能しませんが、エラーは発生しません。

(テーブルを削除すべきではないことはわかっています。別のスマートな方法があります)

4

2 に答える 2

3

Railsを操作するためのヒント-SQLを使用してテーブルを手動で変更しないでください。問題が発生した場合は、@nruthが示したような新しい移行を作成する必要があります。rake:migrateコマンドを実行すると、問題なく機能します。

この場合、「users」テーブルをすでに削除しているため、データベーススキーマがRailsが考えているものと同期していないという問題が発生します。この問題を修正するには、「users」テーブルを手動で作成し、ダウンマイグレーションを実行してからアップマイグレーションを実行することにより、データベーススキーマをRailsが考えているものとほぼ一致させることができます。または、「users」テーブルが存在しなくなったという事実を利用して、Railsの速度を上げることができます。Railsは、移行情報をschema_infoテーブル(Rails <2.1)またはschema_migrationsテーブル(Rails> = 2.1)のいずれかに格納します。そのテーブルを削除すると、Railsはスキーマが存在しないと見なし、すべてのアップマイグレーションを実行して、「users」テーブルを再作成しようとします。

最後に、時間の経過とともに、含めるのを忘れた1つまたは2つの列を個別に追加する多数の移行が蓄積される可能性があります。まだ出荷していないか、まだ本番環境にない場合は、テーブルのベースラインのような移行を作成できます。次のようになります。

class CreateBaselineUsers < ActiveRecord::Migration
  def self.up
    create_table :users, :force => true do |t|
      t.string :name
      ...

これにより、テーブルが強制的に削除され、必要なすべての属性を使用して再作成されます。

于 2010-08-30T00:34:49.023 に答える
2

移行は 1 回実行され、使用済みとしてデータベースに保存されます (schema_migrations テーブルを参照してください)。rake db:migrate:reset を使用して最初の移行を再実行することもできますが、次のように新しい移行を追加することをお勧めします (データベースにデータが含まれている場合、データベースを吹き飛ばしたくないでしょう)。

スクリプト/移行の生成 add_authorization_token_to_users authorization_token:string

次のようなものが生成されます。

class AddAuthorizationTokenToUsers < ActiveRecord::Migration
  def self.up
    change_table :users do |t|
      t.string :authorization_token //this is the new attribute that I insert
    end
  end

  def self.down
    remove_column :users, :authorization_token
  end
end

列の追加/削除、change_table などがどのように機能するかを確認するには、http://api.rubyonrails.org または http://guides.rubyonrails.org/migrations.html の ActiveRecord::ConnectionAdapters::SchemaStatements を参照てください。

于 2010-08-29T23:30:03.907 に答える