gpt4 book ai didi

ruby-on-rails - Rails - 在审计中保存租户(以前的acts_as_audited)

转载 作者:行者123 更新时间:2023-12-01 06:27:06 24 4
gpt4 key购买 nike

我有 Audited (formerly acts_as_audited)设置和工作。 user_id 已成功保存在审计表中,但我想不出一种有效的方法来保存tenant_id(我有带范围的 Multi-Tenancy 设置)。我曾尝试使用自述文件中描述的关联审计技术,但这对我不起作用。

我目前的解决方案是使用 after_audit 每个模型中的回调(可以使用 Rails 关注点实现)以获取最后一次审计并保存租户 ID:

def after_audit
audit = Audit.last
audit.tenant_id = self.tenant_id
audit.save!
end

虽然这有效,但必须再次查询审计然后更新它似乎效率低下。在保存之前将tenant_id添加到审计中对我来说更有意义,但我不知道如何做到这一点。是否可以在保存之前将tenant_id 添加到审计中?如果是,那么如何?

编辑:

我也试过在我的审计模型中包含我的默认租户范围,但它似乎没有被调用:

audit.rb
class Audit < ActiveRecord::Base
default_scope { where(tenant_id: Tenant.current_id) }

application_controller.rb
class ApplicationController < ActionController::Base
around_action :scope_current_tenant

def scope_current_tenant
Tenant.current_id = current_tenant.id
yield
ensure
Tenant.current_id = nil
end

编辑:2/1/16

我仍然没有对此实现解决方案,但是我目前的想法是使用:
#model_name.rb
def after_audit
audit = self.audits.last
audit.business_id = self.business_id
audit.save!
end

在这段代码中,我们获得了当前模型的最后一次审计。这样我们只处理当前模型,没有机会将审计添加到另一个业务中(据我所知)。我会将此代码添加到关注点中以使其保持干燥。

我仍然无法让正常的 Rails 回调在审计模型中工作。我目前看到的唯一另一种方法是 fork 和修改 gem 源代码。

最佳答案

我的任务是实现审计,并添加对组织的引用。迁移添加了这一行:

t.references :org, type: :uuid, index: true, null: true

为了保存 org_id,我最终编写了一个初始化程序 - audited.rb。该文件如下所示:
Rails.configuration.after_initialize do
Audited.audit_class.class_eval do
belongs_to :org, optional: true

default_scope MyAppContext.context_scope

before_create :ensure_org

private

def ensure_org
return unless auditable.respond_to? :org_id

self.org_id = auditable.org_id
end
end
end

希望这可以帮助!

关于ruby-on-rails - Rails - 在审计中保存租户(以前的acts_as_audited),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27145771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com