0

Ich habe das folgende SzenarioRails Destroy All Nested Verbände

class Company < ActiveRecord::Base 

    has_many :depots, inverse_of: :company, :dependent => :destroy 
    has_many :users, inverse_of: :company, :dependent => :destroy 
    has_many :products 

    end 

    class Depot < ActiveRecord::Base 

    has_many :products, :dependent => :destroy 
    has_many :zones, :dependent => :destroy 
    belongs_to :company 

    end 

    class Product < ActiveRecord::Base 

     belongs_to :depot 
     belongs_to :company 

    end 

    class Zone < ActiveRecord::Base 
     belongs_to :depot 
    end 


    class User < ActiveRecord::Base 
     belongs_to :company, , inverse_of: :users 
    end 

    ## and zone has_many locations which further has some associated models. 

Ich möchte alle zugehörigen Modelle mit der Firma löschen, ohne sie einzeln aufrufen. Meine abhängige Zerstörung funktioniert nicht und wenn ich versuche, die Firma zu löschen, sind die Produkte immer noch da. Ich habe versucht zu ersetzen

dependent: :destroy #to delete_all 

aber kein Glück. Wie kann ich alle verschachtelten Objekte mit einem einzigen Aufruf von destroy an die Firma löschen?

bearbeiten

kann ich

Company.reflect_on_all_associations(:has_many) 

aufrufen und löschen Sie alle Verbände eins nach dem anderen, aber ich möchte nicht für diesen Ansatz gehen. Irgendeine Hilfe??

+0

Bitte senden Sie das Ergebnis der folgenden MySQL-Abfrage: "SHOW CREATE TABLE Unternehmen" – Bustikiller

+0

Entschuldigung, ich benutze Postgres als meine DB. –

Antwort

0

Ich glaube, mit der "inverse_of" -Klausel in Ihren Modellen ist das Problem nach dem letzten Punkt in der Rails-Dokumentation darauf. Entferne sie und versuche es. Wie in der Dokumentation aufgeführt:

Es gibt ein paar Einschränkungen Unterstützung inverse_of:

Sie mit nicht funktionieren: durch Assoziationen. Sie arbeiten nicht mit: polymorphe Assoziationen. Sie arbeiten nicht mit: als Assoziationen. ** Für assignes_to Assoziationen, has_many inverse Assoziationen werden ignoriert.

+0

machte es keinen Unterschied. Ich habe beides versucht, mit und ohne inverse_of und es hat nicht funktioniert. Ich muss es verwenden, weil ich einige Assoziationen habe, die im Formular für die Firma vorgeladen werden müssen. Ich kann delete_all nicht verwenden, weil es keine Zerstörung für Depots und Produkte auslöst. –

0

nicht wirklich sicher, was nicht mit dem Setup funktioniert, aber es funktioniert, wenn Sie Ihre inverse_of symmetrisch machen:

class Company < ActiveRecord::Base 
    has_many :depots, inverse_of: :company, dependent: :destroy 
    has_many :users, inverse_of: :company, dependent: :destroy 
    has_many :products 
end 

class Depot < ActiveRecord::Base 
    has_many :products, inverse_of: :depot, dependent: :destroy 
    has_many :zones, inverse_of: :depot, dependent: :destroy 
    belongs_to :company, inverse_of: :depots 
end 

class Product < ActiveRecord::Base 
    belongs_to :depot, inverse_of: :products 
    belongs_to :company 
end 

class Zone < ActiveRecord::Base 
    belongs_to :depot, inverse_of: :zones 
end 


class User < ActiveRecord::Base 
    belongs_to :company, inverse_of: :users 
end 

Ursprüngliche Antwort

Möglicherweise möchten Sie zu überarbeiten, wie Klassen zugeordnet sind. In Ihrem Beispiel fehlt die Klasse Depotbelongs_to :company.

Gleichermaßen hat das Produkt belongs_to :company kein Gegenstück in Company. Die letztere Zuordnung kann entfernt und in eine has_many through umgewandelt werden, da Depots zum Unternehmen gehören und Produkte zum Depot gehören.

+0

überprüfen Sie das Update bitte –

0

Folgen Sie dem Rails-Weg, so dass die Tabelle in Ihrer DB ein company_id Feld hat und so weiter?

+0

ja ich bin, alles ist richtig eingerichtet und ich kann Depots und Produkte in verschachtelten Attributen erstellen. Es bedeutet, dass die Verbände gut funktionieren. –

+0

Mit den verfügbaren Informationen kann ich es nicht herausfinden. Könnten Sie den genauen Code angeben, den Sie verwenden? – gsid

+0

Zum Beispiel kann es ein Controller-Problem sein, wenn Sie [access_nested_attributes_for] (http://stackoverflow.com/questions/20117959/accepts-nested-attributes-for-rails-4-is-not-deeleting) verwenden – gsid