2

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 を使用しています。

4

0 に答える 0