2009-03-31 13 views
6

ステータスカラムを持つActiveRecordモデルがあります。モデルがステータスの変更と共に保存されるとき、ステータスの変更とその変更の責任者を履歴ファイルに書き込む必要があります。私はafter_saveコールバックがうまくいくと思っていましたが、status_changedを使用することはできません。動的メソッドを使用して、履歴の書き込みが実行する必要があることを確認します。モデルが保存されているがステータスが変更されていない場合は、履歴に書きたいとは思わない。私は今、それを処理するための唯一の考えは、after_saveを実行する必要があるかどうかを判断するためにインスタンス変数フラグを使用することです。何か案は?column_changedに基づいて関連付けられたモデルを作成するためのRails after_saveコールバック?

答えて

0

私は2つのソリューションを参照してください。あなたが言ったように

  1. を:変数フラグを追加し、それが設定されたときにコールバックを実行します。

  2. レコードの更新後にsave_historyを実行します。

例:

old_status = @record.status 
if @record.update\_attributes(params[:record]) 
    save_history_here if old_status != @record.status 
    flash[:notice] = "Successful!" 
    ... 
else 
    ... 
end 
6

代わりbefore_saveコールバックを使用してください。次に、新しいステータス値と古いステータス値の両方にアクセスできます。コールバックはトランザクション内にラップされるため、保存に失敗するか、別のコールバックによってキャンセルされると、履歴書込みもロールバックされます。質問が投稿されましたので、これは変更されているかもしれませんが、after_saveコールバックが利用可能*_changed?動的なメソッドを持って、正しく設定する必要があります

10

class Order 
    after_save :handle_status_changed, :if => :status_changed? 
end 

または

class Order 
    after_save :handle_status_changed 
    def handle_status_changed 
    return unless status_changed? 
    ... 
    end 
end 
私のために正しく作品

/W Rails 2.3.2。

-6

データベーストリガーについて聞いたことがない人はいますか? データベース・サーバーにon_updateデータベース・トリガーを書き込むと、レコードが更新されるたびに、関連する監査表に以前のレコードの値の履歴コピーが作成されます。

これは私がRailsについて軽視している主なものの1つです。開発者のためにすべてのことをやろうとすると、開発者を騙して、あまりにも多くの時間を費やして開発者を欺くことになります。

あなたはどのように履歴ログファイルにデータベース・トリガー書き込みをするために私を見ることができる場合、私はあなたをupvoteよもう一度

+0

のRailsで首を振ります。 – Georges

+0

なぜデータベース・トリガーがログ・ファイルに書き込むのですか?この場合、トリガの唯一の目的は、トリガが書き込まれたテーブルの履歴アクティビティログとして機能します。ファイルへのロギングはアプリケーションの責任です。私は基本的なシステム理解の根本的な欠如があると考え始めています。しかし、私たちはRailsについて話しています。だから、私は、 "なぜなら"精神を知らずにすべてを行うことを説明していると思います。犯行はない、ジョルジュ。しかし、Railsは常識的なプログラミングの逸話であることが最善です。 – Skittles

+0

ああ、申し訳ありません。私は元のコメントが歴史*ファイル*を述べたので、私はもともとあなたのコメントを誤解したと思います。 あなたはそうです。この例では、監査テーブルとトリガーがはるかに優れています。 Upvoted。 – Georges

関連する問題