2016-12-23 5 views
1

Rails 5.0を使用しています。それは、downのメソッドはupの逆の順序でなければならないとRailsガイドと私のチュートリアルで言います。例えば :移行ファイルで、「ダウン」部分のメソッドは、「上」から逆の順序にする必要がありますか?

class AlterUsers < ActiveRecord::Migration[5.0] 
    def up 
    rename_table("users", "admin_users") 
    add_column("admin_users", "username", :string, :limit =>25, :after => "email") 
    change_column("admin_users", "email", :string, :limit => 100) 
    end 

    def down 
    change_column("admin_users", "email", :string, :default => '', :null => false) 
    remove_column("admin_users", "username") 
    rename_table("admin_users", "users") 
    end 
end 

downのメソッドは、それがupで実行された順序とは逆に現れます。すなわち、が最後にupから実行されたため、downで最初に実行されます。

downは、データベースを以前の状態に戻すことを許可する目的で、すべてupを元に戻す必要があることを理解しています。 downのメソッドが、実行された順序と逆の実行が必要な理由があったのかどうか、私はちょうど疑問に思っていましたup

答えて

2

Shouldは必ずしも必要なわけではないのでここに集中する言葉ですが、行うことの習慣に入るのは良い習慣です。実際には、手順にお互いに関係のある移行が含まれている場合にのみ必要です。

class AlterUsers < ActiveRecord::Migration[5.0] 
    def up 
    add_column "users", "first_name", :string 
    add_column "users", "last_name", :string 
    end 

    def down 
    remove_column "users", "first_name" 
    remove_column "users", "last_name" 
    end 
end 

上記の例では、2つの変化が全くお互いに影響を与えていないと私は順序が逆転していないにもかかわらず:実行順序は重要ではありません、移行の例を与えることを

とにかく問題を引き起こすことは決してありません。

あなたの質問の例を見て、後で列を追加するテーブルの名前を変更することは、非常に関連した変更です。したがって、downメソッドの順序を逆にしない場合は、最初にテーブルの名前を"admin_users"から"users"に変更してから、もはや存在しないテーブル"admin_users"の列を削除しようとすると、移行が失敗する可能性があります。これはもちろんremove_columnへの呼び出しを調整して"users"テーブルから削除することで簡単に修正できますが、一度そこに行くと、移行が非常に面倒になります。

TL; DR:

それは常に必要とされていませんが、あなたは常にそれを行うならば、あなたはので、競合マイグレーションの問題に実行する可能性が低いです。

+1

あまり感謝してくれてありがとうございました。 – the12

関連する問題