私は、単一テーブル継承を使用し、異なるタイプ(学期または学期のどちらかの学年)のモデルを持っており、各タイプには独自の検証があります。ユーザーがレコードのタイプを変更しようとすると、ドロップダウンからどの年度タイプを選択して変更することができます。しかし、ユーザーが型を変更した場合、新しいクラスの検証を実行する方法と古い検証を実行する方法を理解できません。次のように例えば、私のコードは次のとおりです。今年のタイプは学期で、ユーザーは四半期にそれを変更した場合タイプの列を使用して、レコードのタイプを変更し、正しいクラスのバリデーションをレールで実行するにはどうすればよいですか?
@school_year = SchoolYear.find(params[:id])
respond_to do |format|
if SchoolYear::SUBCLASSES.include? params[:school_year]['type']
@school_year[:type] = params[:school_year]['type']
else
raise "Invalid type"
end
if @school_year.update_attributes(params[:school_year])
# done
else
# validation problem?
end
は今、私はQuarterSchoolYearの検証は、学期のそれらの実行としないことを期待しています。コードを変更して動作させるにはどうすればよいですか?
トランザクションで実際には保存されず、検索が失敗するため、urコードの4行目で失敗します。 – umar
「実際に取引でそれを保存しない」という意味はどうですか? 'save!'は例外を発生させますか? – zetetic
私が意味することは、トランザクションに2つ以上の「保存」を入れ、トランザクション内でクラッシュしないと、すべてが書き込まれ、それ以外の場合は書き込まれないということです。トランザクション中に、「保存」を書いてそれを見つけようとすると、まだ実際には書き込まれていないので、それを見つけることができず、メモリからのアクセス以外はアクセスできません。その行は実際に行3で変更されていないので、行4のurコードのfindは失敗します。このアプローチはうまくいきません – umar