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 です)