Rails ガイドを正しく読んだ場合、false を返す before_destroy コールバックは、ロールバック コマンドを発行してオブジェクトの破棄を停止します。
ただし、オブジェクト自体は削除されていませんが、そのオブジェクトの HABTM 関係にあるすべてのオブジェクトが削除されていることがわかりました。どうすればこれを防ぐことができますか?
適切なコード ブロックは次のとおりです。
class UserGroup < ActiveRecord::Base
# Associations
has_and_belongs_to_many :users, :join_table => "user_group_membership"
attr_protected :is_default
# Callbacks
before_destroy :destroy_associations
def destroy_associations
if self.is_default?
errors.add(:base,"You can't delete the default")
return false
end
self.users.clear
end
end
「is_default」グループで destroy を呼び出すと、正しいエラー メッセージがベースに追加され、UserGroup オブジェクトは破棄されませんが、:users コレクション内のすべての関連付けがクリアされます。
コード「self.users.clear」に到達しないことはわかっていますが、なぜ HABTM コレクションが失われるのでしょうか?
それが役立つ場合、私は mssql データベースで JRuby 1.9 を使用しています。