【问题标题】:How to skip all callbacks except paper-trail when updating an ActiveRecord model?更新 ActiveRecord 模型时如何跳过除纸迹之外的所有回调?
【发布时间】:2016-10-16 20:53:58
【问题描述】:

我有一个启用了纸迹的模型。在我的一个 API 路由中,我必须运行 the_model.update_columns ... 以便可以修改(和保存)模型实例而不触发所有关联的回调(这些回调有很多我不想要的副作用这个特定的路线)。

但是,我仍然希望通过书面记录记录此更改。有什么合理的方法可以实现吗?

【问题讨论】:

  • 听起来最好从回调中删除一些东西,除非你真的总是希望它们在每次更改时发生。我可以从你的描述中看出你想要他们在X but not Y when Z is false。只需删除它们并手动调用方法即可。

标签: ruby-on-rails activerecord paper-trail-gem


【解决方案1】:

这既简单又笨重,但它会完全按照您的意愿完成:

class ThisModel < ActiveRecord::Base
  ...
  def update_me_no_callbacks(att_1, attr_2, attr_3, ...)
    self.update_columns(
      attr_1: attr_1,
      attr_2: attr_2,
      attr_3: attr_3,
      ...
    )

    # Do paper-trail code
  end
end

【讨论】:

  • 谢谢。可悲的是,# Do paper-trail code 是我的问题的一部分。 :-) 我似乎找不到手动触发纸迹的记录方法。
  • 无论如何,我目前的解决方案是在我的所有回调之后添加, unless: :some_predicate?。然后定义该谓词以在我不希望回调运行时返回true。这有点麻烦,但这样纸轨回调仍然会被执行。
猜你喜欢
  • 2022-01-11
  • 2019-10-11
  • 2014-05-05
  • 2010-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多