2009-03-29 8 views
5

私はこのバグのトラブルシューティングを行っており、最終的にその原因を発見しました。私はいつも、私はmy_object.save(false)は本当にアクティブレコードの検証をスキップしません

@my_model.save(false) 

を呼び出したときに、私は私のActiveRecordの検証をスキップしだろうという印象の下にありました。これは部分的に真実であることが分かります。私のオブジェクトはデータベースに保存されています私のActiveRecordの検証を DESPITE。私の検証では、検証プロセス中に子どものモデルの1つが修正されるため、問題が存在します(これは24時間ロケーションのスケジュールアプリケーションなので、ランチが保存されると、保存日と翌日チェックされます)

私の質問はこれです:実際に検証をスキップしてデータベースに直接移動する方法はありますか?これは通常のActiveRecordの動作ですか、それともユーザーが「2am」を意味するのかを確認することです。または私の妥当性検証の深いところでダイビングする必要がありますか?または私は幸運から私の検証を書き直す必要がありますか?

+0

を使うんこれは、検証でモデルを変更するため問題になります。私は、検証以外の何かを使ってデータをサニタイズするだろう。 – bhollis

+0

それはまさにそれです!私はそれが私の究極の答えだと推測していますが、私は別のものを見つけることができるかどうか私の運を試すと思いました。 – BushyMark

+0

バリデーションを使用してビジネスオブジェクトを後処理することは間違いなく匂いです。バリデーションはデータをチェックするためのものであり、変更するものではありません。変更するには、Before/After-Save、Before/After-Createなどの様々なActiveRecordライフサイクルフックを使用してください。 – Matthias

答えて

12

私の問題は、のいずれかのために存在する: http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

ここではそれらをスキップする方法についていくつかの詳細をコールバックを使用してのガイドもあります。ここでは はActiveRecordのコールバックのドキュメントです私の検証では、検証プロセス中に子供モデルの1つが変更されます

oblemsは遠ざかります。バリデーションは決してオブジェクトを修正すべきではありません!

3

私はOrionに同意し、オブジェクトを変更するための検証を使用しないで、代わりにafter_saveのようなコールバックを使用します。

+0

誰でもこれを落とした人は、何かを考え直す必要があります。検証は検証のためのものです。あなたが意見に同意しない場合は、あなたの理論が何であるかを見ることができます。 – nitecoder

5

私は同意すると、コールバックを使用してレコードと対話する必要があります。検証は、あなたがそれを行う必要性を見つけるまだ場合..

をオブジェクトを変更しないので、あなたが検証コードはまだ、それはちょうどそれらの結果を無視しています実行していることを言っている

 
myobject.save_without_validation 
関連する問題