0

Я следующий сценарийРельсы уничтожить все Вложенные ассоциации

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. 

Я хочу, чтобы удалить все связанные модели с компанией, не называя их по одному. Мой зависимый истребитель не работает, и когда я пытаюсь удалить компанию, продукты все еще там. Я пробовал заменить

dependent: :destroy #to delete_all 

но не повезло. Как я могу удалить все вложенные объекты с помощью одного вызова destroy для компании?

Редактировать

Я могу назвать

Company.reflect_on_all_associations(:has_many) 

и удалить все ассоциации по одному, но я не хочу, чтобы пойти на этот подход. Любая помощь??

+0

Пожалуйста, опубликуйте результат следующего запроса MySQL: «SHOW CREATE TABLE companies» – Bustikiller

+0

извините, я использую Postgres как свою БД. –

ответ

0

Я считаю, что использование предложения «inverse_of» в ваших моделях - это проблема, связанная с последней точкой в ​​рельсах. Удалите их и попробуйте. Как указано в документации:

Есть несколько ограничений для inverse_of поддержки:

Они не работают с: через ассоциацию. Они не работают с: полиморфными ассоциациями. Они не работают с: как ассоциации. ** Для ассоциаций belongs_to инверсные ассоциации has_many игнорируются.

+0

это не имело никакого значения. Я пробовал оба, с и без inverse_of, и это не сработало. Я должен использовать его, потому что у меня есть некоторые ассоциации, которые необходимо предварительно загрузить в форме для компании. Я не могу использовать delete_all, потому что он не запускает уничтожение для складов и продуктов. –

0

Не совсем уверен, что не работает с вашей установкой, но это работает, если вы сделаете свой inverse_of симметричную:

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 

Оригинальный ответ

Вы можете пересмотреть, как классы связаны.

В вашем примере отсутствует Depot класс belongs_to :company.

Аналогичным образом не имеет аналогов в Company. Последняя ассоциация может быть удалена и преобразована в has_many through, так как Депо принадлежат Компании и Продуктам принадлежат Депо.

+0

проверьте обновление, пожалуйста, –

0

Вы следуете по пути Rails, так что таблица depots в вашей БД имеет поле company_id и так далее?

+0

да, я настроен правильно, и я могу создавать хранилища и продукты в вложенных атрибутах. Это означает, что ассоциации работают нормально. –

+0

Имея доступную информацию, я не могу понять это. можете ли вы указать точный код, который вы используете? – gsid

+0

Например, это может быть проблема с контроллером, если вы используете [accepts_nested_attributes_for] (http://stackoverflow.com/questions/20117959/accepts-nested-attributes-for-rails-4-is-not-deleting) – gsid

Смежные вопросы