1

Rails 2.3 から Rails 3 にアプリを移行しています。heroku に移行する予定なので、postgres にも移行します。

多くのフィールド (約 30) を持つモデルがあります。2 つを除いて、これらすべてのフィールドの完了を検証したいと思います。Rails 2 アプリには次のものがありました。

validates_presence_of (self.column_names - ["id", "email_not_name"]), :on => :update

これは機能し、実際、Rails3 でも機能します。問題は、新しいデータベースの移行を実行しようとしたときに発生します。「PGError: エラー: 関係 "<em>table_name" が存在しません」というエラーが表示されます。これが SQLite3 で発生しない理由はわかりませんが、実際には問題ではありません。

検証を削除すると、移行は正常に実行されます。問題は、self.column_names が実際にはまだ存在しないことです。同様に、移行を次のように変更すると、

validates_presence_of :field1, :field2, :on => :update

移行は問題なく実行されます。明らかに、30 個のフィールドすべてをリストすることもできますが、これは不器用で保守性が低いと思います。私が本当に欲しいのは:

validates :all, :except=>:email_not_name, :presence=>true, :on => :update

残念ながら、それは実際には存在しません。これに頼らずにこれを行う方法はありますか?(rails2 または rails3 スタイルのいずれか)

答え:

わかりましたので、これに出くわした人のために、これを行う方法を次に示します。解決策は、次のように呼び出されるカスタム エラー ハンドラを作成することです。

検証 :check_all_questions_completed, :on => :update

エラーハンドラ自体は次のとおりです。

def check_all_questions_completed
 Person.column_names.each do |col|
  if (Person.column_names - ["id", "email_not_name"]).include?(col) && send(col).nil?
   errors.add(col)
  end
 aend
end

誰かが私のコードを整理できる場合は、してください(関係するモデルは Person です)

4

0 に答える 0