5

次の手順を含む、Rails アプリで一連の移行があります。

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

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

回避策として、「validates_...」行をコメントアウトし、移行を実行してコメントを外すことができますが、それは良くありません。

すべての列が追加された後、ユーザーの作成 (ステップ 2) が最後になるように、移行の順序を変更することをお勧めします。

私はレールの初心者ですが、この状況を処理するための好ましい方法は何かを尋ねたいと思いました:)

4

4 に答える 4

5

移行内で同じ名前のクラスを宣言できます。これにより、アプリ/モデルがオーバーライドされます。

class YourMigration < ActiveRecord::Migration

  class User < ActiveRecord::Base; end

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

end

残念ながら、IDE はこのクラスに基づいてオートコンプリートを試みる可能性があり (Netbeans はそうします)、そこでモデルロジックを使用することはできません (複製する場合を除く)。

于 2008-09-15T13:52:45.723 に答える
5

この問題を回避する最も簡単な方法はrake db:schema:load、db:migrate の代わりに 2 台目のマシンで使用することです。rake db:schema:loadスキーマをゼロから移行するのではなく、schema.rb を使用してスキーマの最新バージョンをロードします。

実稼働マシン (データの保持が重要な場合) にデプロイするときにこの問題が発生した場合は、おそらく競合のない単一のファイルに移行を統合する必要があります。

于 2008-09-15T10:55:59.140 に答える
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
于 2009-09-23T04:29:16.397 に答える