2016-05-18 2 views
3

у меня есть некоторые проблемы, чтобы использовать after_destroy в моделиRails Модель - after_destroy никогда не называли

Вот это одна:

class Transaction < ActiveRecord::Base 
    belongs_to :user 
    delegate :first_name, :last_name, :email, to: :user, prefix: true 

    belongs_to :project 
    delegate :name, :thanking_msg, to: :project, prefix: true 

    validates_presence_of :project_id 

    after_save :update_collected_amount_in_project 
    after_update :update_collected_amount_if_disclaimer 
    after_destroy :update_collected_amount_after_destroy 

    def currency_symbol 
    currency = Rails.application.config.supported_currencies.fetch(self.currency) 
    currency[:symbol] 
    end 

    private 

    def update_collected_amount 
    new_collected_amount = project.transactions.where(success: true, transaction_type: 'invest').sum(:amount) 
    project.update_attributes(collected_amount: (new_collected_amount/100).to_f) # Stored in € not cents inside projects table 
    end 

    def update_collected_amount_in_project 
    update_collected_amount if transaction_type == 'invest' && success == true 
    end 

    def update_collected_amount_if_disclaimer 
    update_collected_amount if transaction_type == 'invest' && self.changes.keys.include?('success') && self.changes.fetch('success', []).fetch(1) == false 
    end 

    def update_collected_amount_after_destroy 
    update_collected_amount 
    end 
end 

Когда я использую что-то вроде:

Transaction.last.delete 

Он никогда не идут внутри моего after_destroy я попытался включить некоторые выходы, но ничего. Я не знаю, если я ошибаюсь в том, как я использую этот after_destroy, я также пробовал before_destroy, и у меня такая же проблема. after_save и after_update работа совершенно.

+0

Включить отладчик как Поддеть или ByeBug и установить точки останова, а не пытаться отлаживать с помощью вещей, как 'puts' или' Rails.logger'. – meagar

ответ

9

Обратные вызовы after_destroy не вызываются на delete. Они называются только, если вы звоните destroy, например, так:

Transaction.last.destroy 

Это фактически единственное различие между этими двумя методами. Delete обходит обратные вызовы.

Удалить также не будет выполнено никаких вариантов ассоциации :dependent.

Причина этого заключается в том, что он никогда не создает экземпляр объектов активной записи, которые вы удаляете, он просто выполняет инструкцию SQL delete в отношении базы данных.

+0

Есть ли обратный вызов при удалении? –

+1

Нет, он полностью обходит все эти обратные вызовы. Единственный раз, когда вы должны использовать удаление, - это то, что вы по какой-то причине хотите обойти свои обратные вызовы destroy. –

+0

Спасибо за объяснения ^^ –

0

Я думаю, что вы можете использовать камень Рельсы-наблюдателя, который может помочь вам в добавлении after_destroy обратного вызова

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