2008-09-15 1 views
4

以前の移行を破る:Railsのモデルのバリデータは、私は、以下のステップを含むレールアプリの移行の配列を有し

  1. このモデルのインスタンスを作成します。「ユーザー」モデルの基本的なバージョン
  2. を作成します - 私のシステムに少なくとも1人の初期ユーザーがいなければならないので、ログインして使い始めることができます
  3. 「ユーザー」モデルを更新して新しいフィールド/列を追加します。

ここでは、この新しいフィールド/列に "validates_inclusion_of"を使用しています。これは、これらの移行が適用されたデータベースをすでに持っていた初期の開発マシンでうまく機能しました。ただし、新しいマシンに移動してすべての移行を実行すると、移行3のフィールドがまだモデルクラスに追加されていないため、validates_inclusion_ofが失敗するため、手順2が失敗します。回避策として

、私は、「検証し_...」の行をコメントアウトマイグレーションを実行し、それをコメント解除し、それは素晴らしいではありませんすることができます。より良い

は、ユーザーの作成(ステップ2)が最後になるように、すべての列が追加された後、私の移行を並べ替えることであろう。

私もレールの初心者ですので、私は、私はこのような状況を処理するための好ましい方法は:)

答えて

5

でこの問題を回避する最も簡単な方法は、すくいデシベル使用することが何であるかを尋ねるだろうと思って:スキーマ:負荷をdb:migrateの代わりに2番目のマシンで実行します。 D:S:Lは、schema.rbを使用してスキーマの最新バージョンをロードします。

生産マシンにデプロイする際に(保存データが重要である)、この問題が発生した場合は、おそらく競合することなく、単一のファイルにあなたの移行を統合する必要があります。あなたは、移行の内側に同じ名前を持つクラスを宣言することができ

5

、それはあなたのアプリケーション/モデル1よりも優先されます:

残念ながら
class YourMigration < ActiveRecord::Migration 

    class User < ActiveRecord::Base; end 

    def self.up 
    # User.create(:name => 'admin') 
    end 

end 

を、あなたのIDEは(NetBeansはありません)。このクラスに基づいて自動補完しようとするかもしれとモデルロジックをそこに使用することはできません(複製する場合を除いて)。

0

私は今これを行う必要があります。 BiHiのアドバイスに基づいて、モデルを手動でロードしてから、必要なメソッドを再定義しています。

load(File.join(RAILS_ROOT,"app/models/user.rb")) 
class User < ActiveRecord::Base 
    def before_validation; nil; end # clear out the breaking before_validation 
    def column1; "hello"; end  # satisfy validates_inclusion_of :column1 
end 
関連する問題