2011-01-11 4 views
0

モデルインスタンスを作成すると、 "invoice_no"が生成されます。このinvoice_noは、フォームで指定された請求書日付から派生した請求書のfinancial_yearに依存します。複合検証とコールバックメソッド

今、私はinvoice_dateの存在を検証します。 invoice_dateが有効な場合のみ、financial_yearとinvoice_noを生成できます。

今、invoice_noの一意性を検証する最良の方法はありますか?

1. validates :invoice_date, :presence => true 
2. before_create :assign_financial_year # Based on a valid invoice_date 
3. before_create :generate invoice_no # Based on a valid financial_year 
4. validates :invoice_no, :uniqueness => {:scope => [:financial_year, :another_field], :case_sensitive => false} 

私はすでに、このテーブルのすべての関連フィールドに基づいてデータベースにユニークなインデックスを設定しています。

上記のステップ2と3をステップ1と4の検証と組み合わせる最良の方法は何ですか? または、それは生成された番号でデータベース内ですでに処理されているため、レールの一意性検証を気にする必要はありませんか?この検証を行わないと、一意性違反のために生成された場合に例外が発生した場合、例外を処理するにはどのような方法が適していますか?

私はかなりRailsを経験していて、すでにいくつかの醜い方法を考えていました。他の経験豊かなRailsプログラマーの戦略についてもっと意見を述べたいだけです。

答えて

1

妥当性検査の実行後、必ずしも年を計算する必要はないと思います。 invoice_dateがない場合は事前に行うことができ、正常に失敗する可能性があります。そうすれば、あなたの妥当性検査はまだ実行されています。

+0

基本的に、請求書の日付がある場合は、会計年度を設定します。 financial_yearがある場合はinvoice_noを設定し、次に検証します。 –

+0

おそらくbefore_validateコールバックでもやっています。そういうわけで、model.valid? (単にmodel.saveではなく)まだ動作します。 – noodl

関連する問題