문제

레일 4에 루비에서 부모님이 많은 아이들이 있다고 가정 해 봅시다.부모가 삭제되면 아이들도 삭제해야합니다.그 외에도, 아이는 고아가 아니라면 삭제해서는 안됩니다.어떻게해야합니까?

다음을 사용하여 다음을 시도했습니다

class Parent < ActiveRecord::Base
  has_many :children, inverse_of: :parent, dependent: :destroy
end

class Child < ActiveRecord::Base
  belongs_to :parent, inverse_of: :children
  before_destroy :checks
private
  def checks
    not parent # true if orphan
  end
end
.

before_destroy 점검을 사용하면 아무 것도 삭제되지 않습니다.부모님 삭제가 있기 때문에 호출 된 이유가 있으면이 방법을 알리는 방법이 있습니까?

이거 이상한 일입니까?나는 아이들의 삭제를 방지합니다.

도움이 되었습니까?

해결책

RAILS : 부모가 파괴되고 있기 때문에 PERSED가 파괴되고 있으므로 _DestROY 콜백을 비활성화하는 방법 (dependent=> : destroy) , 시도하십시오 :

어린이 :

belongs_to :parent
before_destroy :prevent_destroy
attr_accessor :destroyed_by_parent

...

private

def prevent_destroy
  if !destroyed_by_parent
    self.errors[:base] << "You may not delete this child."
    return false
  end
end
.

학부모 :

has_many :children, :dependent => :destroy
before_destroy :set_destroyed_by_parent, prepend: true

...

private

def set_destroyed_by_parent
  children.each{ |child| child.destroyed_by_parent = true }
end
.

우리는 Paranoia를 사용하고 있고 dependent: delete_all가 소프트 삭제보다는 하드 삭제되기 때문에이 작업을 수행해야했습니다.내 장은이 일을 할 수있는 더 좋은 방법이 있다고 말하면서, 그것은 분명하지 않으며, 이것은 일을 끝내립니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top