2016-04-18 4 views
2

私はリクエストテーブルを持っています。Railsがロールバックされ、タイプが変更され、再度マイグレーションされます。

class CreateRequests < ActiveRecord::Migration 
    def change 
    create_table :requests do |t| 
     t.string :from 
     t.string :to 

     t.timestamps null: false 
    end 
    end 
end 
私は要求モデルを破壊 rake db:rollback STEP = 5 でデータベースをロールバックし、要求テーブルとを作成したいと思います

t.datetime :from 
t.datetime :to 

しかし、私はSTEP = 2上のモデルを要求する移行テーブルを持って、

class AddStatusToRequest < ActiveRecord::Migration 
    def change 
    add_column :requests, :status, :string, :default => "Pending" 
    end 
end 

問題は、私は要求テーブルを破壊し、日時タイプで新しいRequestテーブルを作成する場合、それはSTEP後に作成し、あります= 2、そして、rake db:migrate railsがStatusカラムをRequestテーブルに追加していないとき。どうすればこれを克服できますか?

+0

あなたが最初から移行を実行した場合はどうなりますか? 'requests'がまだ存在しないので、あなたは' AddStatusToRequest'マイグレーションでエラーを受け取りますか? –

+0

@AnthonyE、正確に。 –

答えて

3

あなたはchange_columnを使用して列の型を変更するには、新しい移行を作成することができます。

コマンドライン:rails g migration change_request_to_from_column_types'

新しい移行:

class ChangeRequestToFromColumnTypes < ActiveRecord::Migration 
    def change 
    change_column :requests, :from, :datetime 
    change_column :requests, :to, :datetime 
    end 
end 
+0

私はこの方法を使用しましたが、別の方法がありますか? –

+0

ライブデータを操作していない場合は、 'rake db:migrate:redo VERSION = 'のような処理を行い、step = 2のファイルに対して繰り返します。 Anthony Eが指摘しているように、既存の移行を変更しない方が一般的です。 –

2

あなたが持っているような状態の競合を避けるために適用された後は、遡及して移行を変更しないことをお勧めします。おそらく最も簡単な解決策は、カラムがすでに存在する場合は何もしないようにガードを使用してrequests表にタイプを追加するための新しい移行を作成することです:

class AddStatusToRequestIfNotExists < ActiveRecord::Migration 
    def change 
    unless column_exists? :requests, :status 
     add_column :requests, :status, :string, :default => "Pending" 
    end 
    end 
end 

EDIT

またしたいと思いますあなたは最初から移行を実行できることを確認してください、あなたは次のように不足しているテーブルを防ぐために、既存の移行を更新する場合があります

class AddStatusToRequest < ActiveRecord::Migration 
    def change 
    unless table_exists? :requests 
     add_column :requests, :status, :string, :default => "Pending" 
    end 
    end 
end 

の理想はないが、それはおそらく最も安全なのですアプローチ。

関連する問題