【问题标题】:How to prevent ActiveRecord::Observer from logging deletion of dependent records if parent record is destroyed?如果父记录被破坏,如何防止 ActiveRecord::Observer 记录从属记录的删除?
【发布时间】:2014-02-12 08:55:45
【问题描述】:

我有一个模型用户 has_one 公司。一家公司可以有许多税费和附加费。我正在使用 ActiveRecord::Observer 为管理员记录用户对其公司数据所做的任何活动。为此,我正在观察用户、公司、税收和附加费模型。对于用户对这些模型中的属性所做的任何更改,我通过在另一个 ActivityLog 模型中创建记录来记录这些活动。 我的模型之间的关联是 -

class User < ActiveRecord::Base
  has_one: :company, dependent: :destroy

class Company < ActiveRecord::Base
  belongs_to: :user
  has_many: :taxes, dependent: :destroy
  has_many: :additional_fees, dependent: :destroy

class Tax < ActiveRecord::Base
  belongs_to: :company

class AdditionalFee < ActiveRecord::Base
  belongs_to: :company

我的观察者如下:

class ActivityObserver < ActiveRecord::Observer
  observe :user, :company, :tax, :additional_fee 

我面临的问题是用户或公司被删除时。 我在观察者的 after_destroy 回调中的 AcitivityLog 模型中创建了一条记录。

def after_destroy(obj)
  ActivityLog.create(performer: 'user_name_here', target: 'record_destroyed(serialised         object)', action: "destroy", description: "#user_name_here has deleted their company #company_name_here", change: "lot_variant")
end

我以这种方式在 ActivityLog 中为观察模型中被删除的每条记录创建一条记录。

因为观察者正在观察所有关联模型,所以当用户或公司被删除时,它会为每个关联记录创建一个新条目。

有没有办法在父节点被销毁时不阻止观察者记录依赖的销毁记录?我不希望在 ActivityLog 模型中为已销毁的依赖记录创建新条目,但只想为已销毁的父记录(公司或用户)进行记录。

【问题讨论】:

    标签: ruby activerecord ruby-on-rails-3.2 callback observer-pattern


    【解决方案1】:

    您可以检查obj 对象类型,如果它是CompanyUser,您可以继续创建ActivityLog

    def after_destroy(obj)
      case obj
        when Company, User then create_activity_log!
      end
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      • 2014-04-04
      • 1970-01-01
      • 2021-05-23
      • 2012-02-07
      相关资源
      最近更新 更多