2012-12-12 16 views
4

我有以下型號:ActiveRecord的傳遞關聯刪除

class Organization < ActiveRecord::Base 
    has_many :providers, :dependent => :destroy 
    has_many :products, :through => :providers 
end 

class Provider < ActiveRecord::Base 
    belongs_to :organization 
    has_many :products, :inverse_of => :provider 
end 

class Product < ActiveRecord::Base 
    belongs_to :provider, :inverse_of => :products 
end 

當我創建一個供應商(無產品)的組織,然後將其刪除與破壞:

Organization.find(1).destroy 

的Rails 3.0。 x 不會刪除關聯的提供程序,使其不存在organization_id。這是奇怪的行爲,我希望無論在哪裏或提供者被刪除(這就是我想要做的)。

我看到有傳遞關聯has_many:products:through =>:providers - 我不知道這是爲什麼提供者沒有被刪除的原因。

感謝所有幫助

編輯:

確定這無關使用Rails,我們在Provider類以下檢查

def prevent_redhat_deletion 
    if redhat_provider? 
     errors.add(:base, _("Red Hat provider can not be deleted")) 
     return false 
    end 
    true 
    end 

,顯然我刪除redhat_provider一。出於某種原因,Rails不會退出並出現錯誤。

+0

您使用的是底層數據庫?你可以發佈調用'destroy'時運行的SQL嗎?模型看起來是正確的,更有可能這是與數據有關的... – PinnyM

+0

PostgreSQL。我只看到:AREL(0.2ms)從「組織」刪除「組織」。「」id「= 4(並在下一行提交)。通過delayed_jobs刪除組織,但這並不重要。刪除SQL語句很簡單。順便說一句代碼是在這裏 - https://github.com/Katello/katello/blob/master/src/app/models/organization.rb – lzap

+0

Btw刪除AR語句是:Organization.unscoped.find(123).destroy和它是在一個不同的過程中完成的。但是,當我從控制檯嘗試它時,我也一樣。 – lzap

回答

1

你也可以試試,正在改變:dependent =:destroy,to:dependent =>:delete。看看提供者是否被刪除。如果他們這樣做,它可能與你的代碼,這阻止刪除。

+0

歡迎在這裏... – lzap