Rails - 在Audited中保存租户(以前为acts_as_audited)

时间:2014-11-26 09:42:40

标签: ruby-on-rails ruby-on-rails-4 multi-tenant acts-as-audited

我已Audited (formerly acts_as_audited)设置并正常工作。 user_id已成功保存在审计表中,但我无法找到保存tenant_id的有效方法(我有使用范围的多租户设置)。我尝试使用README中描述的Associated Audits技术,但这对我不起作用。

我目前的解决方案是在每个模型中使用 after_audit 回调(可以使用Rails关注点实现)来获取上次审核并保存tenant_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

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

我仍然无法在Audit模型中使用正常的Rails回调。我目前唯一看到的另一种方法是分叉并修改gem源代码。

1 个答案:

答案 0 :(得分:1)

我的任务是实施审核,并添加对组织的引用。迁移添加以下行:

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

希望这会有所帮助!