【问题标题】:Rails Model - after_destroy never calledRails 模型 - after_destroy 从未调用过
【发布时间】:2016-05-18 17:56:58
【问题描述】:

我在模型中使用 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 完美运行。

【问题讨论】:

  • 包括像 Pry 或 ByeBug 这样的调试器并设置断点,而不是尝试使用像 putsRails.logger 这样的东西进行调试。

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


【解决方案1】:

after_destroy 回调不会在 delete 上调用。仅当您调用 destroy 时才会调用它们,如下所示:

Transaction.last.destroy

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

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

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

【讨论】:

  • 删除有回调吗?
  • 不,它完全绕过了所有这些回调。唯一应该使用 delete 的情况是,如果您出于某种原因想要绕过销毁回调。
  • 感谢您的解释^^
  • 只是为@Zachary 添加一个点-如果您使用删除而不是销毁您的回调,并且所有约束,如外键也被忽略了。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多