ruby - 如果父记录被销毁,如何防止 ActiveRecord::Observer 记录依赖记录的删除?

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

我有一个拥有一家公司的模型用户。一个公司可以有很多税和附加费。我正在使用 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 模型中为销毁的相关记录创建新条目,但只想记录销毁的父记录(公司或用户)。

最佳答案

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

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

关于ruby - 如果父记录被销毁,如何防止 ActiveRecord::Observer 记录依赖记录的删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21280576/

相关文章:

Ruby:如何将从文件中读取的行拆分为二维数组?

php - 如何使用 codeigniter 优化 activerecords?

php - 如何更新将 +1 添加到所有 ActiveRecord 选定行中的字段

ruby-on-rails - 如何在 Rails 引擎的 rspec 测试中从父应用程序访问模型?

ruby-on-rails - 如何使用 Rails/websocket-rails(独立)调试 'Invalid frame header' Websocket 问题

Ruby:每X个字符插入空格

Ruby 读写带引号的 CSV

ruby-on-rails - 如何在 ROR 中使用 ActiveScaffold 一次创建多个记录

Heroku: 'bundle command not found' 在 Ruby 2.0.0 下

ruby-on-rails - 根据回形针中的样式调整 missing.png 的大小