Ruby-on-Railsの移行問題
-
02-10-2019 - |
質問
やあみんな、私が最初に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
...
これにより、テーブルを強制的にドロップし、必要なすべての属性で再作成します。