Mar*_*lar 6 ruby-on-rails multi-tenant acts-as-audited ruby-on-rails-4
我已经审核(以前的acts_as_audited)设置和工作。user_id 已成功保存在审计表中,但我想不出一种有效的方法来保存tenant_id(我有带范围的多租户设置)。我曾尝试使用自述文件中描述的关联审计技术,但这对我不起作用。
我目前的解决方案是在每个模型中使用after_audit回调(可以使用 Rails 关注点实现)来获取最后一次审计并保存租户 ID:
def after_audit
audit = Audit.last
audit.tenant_id = self.tenant_id
audit.save!
end
Run Code Online (Sandbox Code Playgroud)
虽然这有效,但必须再次查询审计然后更新它似乎效率低下。在保存之前将tenant_id添加到审计中对我来说更有意义,但我不知道如何做到这一点。是否可以在保存之前将tenant_id 添加到审计中?如果是,那么如何?
编辑:
我也试过在我的审计模型中包含我的默认租户范围,但它似乎没有被调用:
审计文件
class Audit < ActiveRecord::Base
default_scope { where(tenant_id: Tenant.current_id) }
Run Code Online (Sandbox Code Playgroud)
应用控制器.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
Run Code Online (Sandbox Code Playgroud)
编辑:2/1/16
我仍然没有对此实施解决方案,但是我目前的想法是使用:
#model_name.rb
def after_audit
audit = self.audits.last
audit.business_id = self.business_id
audit.save!
end
Run Code Online (Sandbox Code Playgroud)
在这段代码中,我们获得了当前模型的最后一次审计。这样我们只处理当前模型,没有机会将审计添加到另一个业务中(据我所知)。我会将此代码添加到一个问题中以使其保持干燥。
我仍然无法让正常的 Rails 回调在审计模型中工作。我目前看到的唯一另一种方法是 fork 和修改 gem 源代码。
我最近将 Acts As Tenant gem 添加到运行 Audited gem 的 Rails 应用程序中。我遇到了同样的问题。我已经添加了
acts_as_tenant :account
Run Code Online (Sandbox Code Playgroud)
到审计模型,但它没有做任何事情。我了解到您无法在审核模型中进行覆盖,但必须创建一个继承自它的自定义审核模型。所以我创建了模型:custom_audit.rb
class CustomAudit < Audited::Audit
acts_as_tenant :account
end
Run Code Online (Sandbox Code Playgroud)
然后我在 conf/initializers 中添加了初始化程序文件audated.rb,如下所示:
Audited.config do |config|
config.audit_class = CustomAudit
end
Run Code Online (Sandbox Code Playgroud)
我仍然遇到除了 show_audit 视图之外所有多租户都正常工作的问题。我最终删除了测试设置中两个租户的所有审核。有效!我现在可以添加新的审计,它们的范围很好。但我仍然需要将实际的客户端数据库合并为一个,并且我不想丢失审核表中的历史记录......不知道如何解决这个问题。
因此,当我尝试访问审核时,它会失败,current_tenant 为零。不知道为什么删除表中的所有当前记录可以修复它,但我需要找到解决方法。
| 归档时间: |
|
| 查看次数: |
553 次 |
| 最近记录: |