6

在Ruby on Rails 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檢查,但是,沒有被刪除。有沒有什麼方法可以告訴這個方法被調用的原因是否是因爲父刪除?

這是一個奇怪的事情要求嗎?我的意思是,防止刪除孩子。

+0

除非您的應用程序包含直接刪除兒童的代碼,否則應該不可能直接刪除它們,但仍可以刪除它們作爲刪除父項的一部分。我不明白你是如何處理這個問題的。你能否更具體一些? – monfresh

+0

你說得對。謝謝。 – user2553863

回答

5

Rails: how to disable before_destroy callback when it's being destroyed because of the parent is being destroyed (: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 

我們不得不這樣做,因爲我們使用的是偏執狂,和dependent: delete_all會硬刪除而不是軟刪除它們。我的直覺告訴我有一個更好的方法來做到這一點,但這並不明顯,而且這完成了工作。

+0

我有同樣的問題,但與has_one的關係。我用一種稍微不同的方式解決了問題,但我也覺得必須有更好的方法來做到這一點。 [我的解決方案](http://stackoverflow.com/questions/23533552/rails-4-activerecord-prevent-dependent-destroy-if-owner-exists) – hector