1

ドキュメントによると、Railshas_many関連付けにはclearメソッドがあります。delete実行直後にSQLクエリを実行するようです。すべての子オブジェクトを削除し、メソッドの時点でのみ関連付けを更新する標準的な方法はありsaveますか? 例えば:

@cart.container_items.delete_all_example # looks like `clear` execute sql at this line
if @cart.save
  # do smth
else
  #do smth
end

親オブジェクトでの多くの変更のために必要であり、それらのすべてをコミットするか、まったくコミットしない必要があります。

4

3 に答える 3

4

あなたはしたくないdelete_all、あなたはしたいdestroy_all

呼び出しは、コールバックと依存レコードを無視してdelete_all、単純なSQLを実行します。delete

を使用すると、各オブジェクトでメソッドdestroy_allが呼び出され、期待どおりに機能し、子レコードがクリーンアップされます。destroy:dependent => :destroy

これは、の時点ですべてのオブジェクトを破壊するわけではなく、レコードを保存saveしていないため、これを行うための標準的な方法はありません。Railsは、後でではなく、メソッド呼び出しの時点で破棄を永続化します。トランザクションであるために多くの破棄が必要な場合は、それらをトランザクションでラップします。save

Cart.begin do
  @cart.container_items.delete_all_example
end
于 2012-07-03T11:05:43.487 に答える
2

これを試して:

Cart.transaction do
  @cart.container_items.delete_all_example # looks like `clear` execute sql at this line
  if @cart.save
    # success
  else
    # error
    raise ActiveRecord::Rollback
  end
end

ActiveRecord::Rollbackトランザクションブロックの外部には伝播されません。単にトランザクションを終了します。

于 2012-07-03T15:17:12.840 に答える
0

をやろうとしているようですtransaction。詳細については、次の記事を参照してください。

于 2012-07-03T11:41:37.223 に答える