【问题标题】:How to call destroy with parameters?如何使用参数调用destroy?
【发布时间】:2019-09-30 19:24:16
【问题描述】:

我正在寻找一种方法来传递参数以销毁记录哪个用户负责记录的销毁。

我使用的每个模型都有一个相应的历史记录表,每次保存记录时我都会在其中记录,记录上的所有参数,以及哪个用户调用它来保存它。我想确保在销毁记录时也这样做。

为了保存,我只是用save(user_id, source) 覆盖了save 方法,因为我不使用任何before_save 回调。使用 destroy 时,我想保留回调 (has_many :submodel, dependent: destroy),同时仍然强制执行日志记录。

理想情况下,我可以拥有以下内容:

def destroy(user_id, source)
    self.transaction do
        #destroy all associations, using same user_id and source
        self.log_descruction(user_id, source)
        #destroy self
    end
end

有什么建议吗?

【问题讨论】:

  • 由于ActiveRecord::Base 的构造方式(例如,包括构建功能的模块),您应该能够调用super 来调用destroy 的原始版本。这应该保留所有的钩子;但是我从未真正尝试过
  • @engineersmnky 这是有道理的。你知道我如何通过回调将相同的参数传递给我想要销毁的子模型吗?
  • 我不能说我曾经尝试过,但您是否考虑过使用已经支持此功能的库,例如 auditedpapertrail
  • 我经常使用 papertrail,它非常好,完全可以(我认为)你想要的。
  • 我不知道有这样的宝石,但它看起来几乎完美。

标签: ruby-on-rails activerecord callback


【解决方案1】:

您不需要保留before_save。不能用before_destroy回拨吗

见:https://guides.rubyonrails.org/active_record_callbacks.html#destroying-an-object

你只需要调用一个方法 before_destroy 资源。并在该方法中保存日志。

【讨论】:

  • 你知道这是否像交易一样有效吗?我想确保历史记录和删除都完成,因此我的理由是覆盖销毁。我也看不到如何使用此方法传递参数
猜你喜欢
  • 1970-01-01
  • 2015-10-29
  • 2017-04-19
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多