0

非常にシンプルなグループとロールモデルがあります

class Group < ActiveRecord::Base
  has_many :roles, :dependent => :destroy
end


class Role < ActiveRecord::Base
  belongs_to :group
  after_destroy :ensure_last_role

  private
  def ensure_last_role
    raise "Can't delete last role" if group.roles.count.zero?
  end  
end

after_destroyは完全に機能し、最後の役割が誤って破棄されることはありません。ただし、これにより、:dependent =>:destroyがすべての役割を破棄しようとしたときに、グループが破棄されるのを防ぐこともできます。グループが破壊されたときにensure_last_roleを呼び出さないことは可能ですか、それともこれにアプローチするためのより良い方法がありますか?

4

1 に答える 1

2

dependent: :destroyこれを少し試してみた後、コールバックを正しい順序で起動できなかったため、リレーションに組み込まれているRailsを使用しないソリューションに落ち着きました。キャッシュにもいくつかの問題があったため、を破棄しようとするたびにRole、そのグループがデータベースにまだ存在するかどうかを確認するための小さなSQLクエリが作成されます。

> role.destroy
  Group Exists (0.2ms)  SELECT 1 FROM "groups" WHERE "groups"."id" = 18 LIMIT 1

とにかく、完全なモデルコードは次のとおりです。

class Group < ActiveRecord::Base
  has_many :roles
  after_destroy :destroy_roles

  def destroy_roles
    roles.each { |r| r.destroy }
  end
end

class Role < ActiveRecord::Base
  belongs_to :group
  before_destroy :ensure_last_role, if: "Group.exists?(group_id)"

  private

  def ensure_last_role
    raise "Can't delete last role" if group.roles.count == 1
  end
end
于 2012-08-12T03:43:33.120 に答える