6

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

4

4 に答える 4

11

これは質問が投稿されてから変更された可能性がありますが、after_save コールバックには*_changed?動的メソッドが使用可能で、正しく設定されている必要があります。

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

Rails 2.3.2 で正しく動作します。

于 2009-11-10T18:02:43.647 に答える
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
于 2009-04-01T15:11:50.733 に答える
-7

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

これは、Rails について私が軽蔑する主な点の 1 つです。開発者のためにあらゆることをしようとするのに非常に多くの時間を費やしているため、開発者は、おかしなデータベース サーバーがすでにすべて単独で実行できることを実行するために特殊な Rails メソッドを作成するなど、下品な行動方針に従わなければならないと思い込まされます。

Railsでもう一度頭を振る

于 2012-03-29T17:41:14.107 に答える