3

before_saveフィルターがトランザクションを停止せずに保存全体を停止する方法はありますか?私がやろうとしているのは、ユーザーが操作して保存できるモデルの「サンプル」バージョンを用意することですが、変更自体が実際に保存されることはありません。以下は、トランザクションを停止し、@ model.update_attributesを呼び出すと(当然)falseを返します。

before_filter :ignore_changes_if_sample
def ignore_changes_if_sample
  if self.sample?
    return false
  end
end

ありがとう!

4

1 に答える 1

1

それがまさにここで起こっていることです。SQL を見ると、BEGIN と COMMIT の間に何も表示されていないはずです。before_save はトランザクションを停止していません。false を返すことで、レコードが保存されないようにしているだけです。

より一般的に質問に答えるために、永続化に失敗したレコードは、例外も発生させない限り、トランザクションを停止しません。例外は、トランザクションのどの部分もコミットされないようにする ROLLBACK をトリガーします。したがって、ここで false を返しても、より大規模で包括的なトランザクションは問題なく続行されます。

ActiveRecord::Transactionsのドキュメントで、トランザクションと Rails がトランザクションをどのように使用するかについて詳しく読むことができます。

于 2012-06-28T15:13:57.313 に答える