Rails模型 - 从未调用after_destroy

时间:2016-05-18 17:56:59

标签: ruby-on-rails ruby-on-rails-4 activerecord

我在模型

中使用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_saveafter_update完美无缺。

2 个答案:

答案 0 :(得分:10)

after_destroy未调用delete回调。只有在您拨打destroy时才会调用它们,如下所示:

Transaction.last.destroy

这实际上是两种方法之间的唯一区别。 Delete绕过了回调。

删除也不会执行任何:dependent关联选项。

这样做的原因是它永远不会实例化您要删除的任何活动记录对象,它只是对数据库执行SQL删除语句。

答案 1 :(得分:0)

我认为你可以使用rails-observer gem,它可以帮助你添加after_destroy回调