質問

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

それで、私がしたことは、Postgresからテーブルユーザーを削除し、最初の移行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

したがって、DBを再度実行すると、新しいユーザーテーブルが新しい属性:Authorization_Tokenで作成されるというホッピングを移行しますが、機能しませんが、エラーはありません。

(私はテーブルを削除すべきではないことを知っています、それを行う別の賢い方法があります)

役に立ちましたか?

解決

移行は一度実行され、データベースに使用されているように保存されます(schema_migrationsテーブルをご覧ください)。 Rake DBを使用してみてください:移行:リセットして最初の移行を再実行しますが、次のように新しい移行を追加するだけで(データベースが含まれているときはデータベースを吹き飛ばすことはありません)、次のようになります。

スクリプト/Migration 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などの動作を追加/削除する方法を確認するには、ActiverCord :: ConnectionAdapters :: Schemastatementsをご覧ください。 http://api.rubyonrails.org また http://guides.rubyonrails.org/migrations.html

他のヒント

Railsを操作するためのヒント - SQLを使用してテーブルを変更しないでください。問題を見たとき、@Nruthが示したような新しい移行を書くべきでした。 Rakingを実行する:移行コマンドはあなたのために正常に機能していたでしょう。

この場合、「ユーザー」テーブルを既に削除しているため、データベーススキーマがRailsが考えているものと同期していないという問題があります。この問題を修正するには、データベーススキーマを取得して、「ユーザー」テーブルを作成して、ダウン移行を実行してからUP移行を実行して、Railsが考えていると思われるものをほぼ一致させることができます。または、「ユーザー」テーブルが存在しなくなったという事実で、Railsをスピードアップすることができます。 Railsは、Schema_Infoテーブル(Rails <2.1)またはSchema_Migrationsテーブル(Rails> = 2.1)のいずれかに移行情報を保存します。そのテーブルを削除すると、Railsはスキーマが存在しないと考え、すべてのアップ移行を実行し、「ユーザー」テーブルを再び再現しようとします。

最後に、時間が経つにつれて、含めるのを忘れた列または2つの列を個別に追加する多くの移行を蓄積することができます。まだ出荷されていないか、まだ生産されていない場合は、テーブルのベースラインの移行を書くことができます。それは次のようになります:

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

これにより、テーブルを強制的にドロップし、必要なすべての属性で再作成します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top