2016-06-08 3 views
1

У меня есть следующие классы:Rails 5 зависимый:: уничтожить не работает

class Product < ApplicationRecord 
    belongs_to :product_category 

    def destroy 
    puts "Product Destroy!" 
    end 

end 

class ProductCategory < ApplicationRecord 
    has_many :products, dependent: :destroy 

    def destroy 
    puts "Category Destroy!" 
    end 
end 

Здесь я пытаюсь переопределить уничтожить метод, где я в конечном счете хочу сделать это:

update_attribute(:deleted_at, Time.now) 

Когда я запускаю следующее заявление в консоли Rails: ProductCategory.destroy_all я получаю следующие выходные данные

Category Destroy! 
Category Destroy! 
Category Destroy! 

Примечание: I ч ave три категории, и каждая категория имеет более одного Продукта. Я могу подтвердить его ProductCategory.find(1).products, который возвращает массив продуктов. Я слышал, что реализация изменена в Rails 5. Любые вопросы о том, как я могу заставить это работать?

EDIT

То, что я в конце концов, хочу есть, мягкие удалить категорию и все связанные с ним продукты в одном дыхании. Это возможно? Или вы сможете перебирать каждый объект продукта в обратном вызове before before? (Последний вариант для меня)

+0

Удалите оба метода уничтожения и повторите попытку. –

+0

Мне кажется, что вы преодолеваете метод destroy_model destroy, и что вы должны называть «super» in destroy? –

+0

Я действительно не предлагаю перезаписывать методы ActiveRecord. сделайте свой собственный, как 'update_as_destroyed' и' update_as_destroyed_all', вместо того, чтобы перезаписывать существующие. – Kkulikovskis

ответ

1

Так вот как я сделал это в конце концов:

class Product < ApplicationRecord 
    belongs_to :product_category 

    def destroy 
    run_callbacks :destroy do 
     update_attribute(:deleted_at, Time.now) 
     # return true to escape exception being raised for rollback 
     true 
    end 
    end 

end 

class ProductCategory < ApplicationRecord 
    has_many :products, dependent: :destroy 

    def destroy 
    # run all callback around the destory method 
    run_callbacks :destroy do 
     update_attribute(:deleted_at, Time.now) 
     # return true to escape exception being raised for rollback 
     true 
    end 
    end 
end 

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

0

Вы должны вызвать супер из метода уничтожения:

def destroy 
    super 
    puts "Category destroy" 
end 

Но я определенно не хотел бы предложить, что вы overide активных методов модели.

+0

от его вопроса он не сработает, потому что запись все равно будет уничтожена. Он не хочет этого – Kkulikovskis

+0

Да, это то, что он хочет сделать, но мой ответ касается его вопроса, поэтому он зависит:: destroy не работает. Он не спрашивает, как реализовать обновление, которое он хочет сделать. –

+0

Да, я отредактировал мой вопрос. –

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