Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails-将租户保存在已审核中(以前作为已审核)_Ruby On Rails_Ruby On Rails 4_Multi Tenant_Acts As Audited - Fatal编程技术网

Ruby on rails Rails-将租户保存在已审核中(以前作为已审核)

Ruby on rails Rails-将租户保存在已审核中(以前作为已审核),ruby-on-rails,ruby-on-rails-4,multi-tenant,acts-as-audited,Ruby On Rails,Ruby On Rails 4,Multi Tenant,Acts As Audited,我已经安装和工作了。用户id已成功保存在审核表中,但我无法找到一种有效的方法来保存租户id(我使用范围设置了多租户)。我曾尝试使用自述文件中描述的相关审计技术,但这对我来说并不适用 我目前的解决方案是在每个模型中使用after_audit回调(可以通过Rails关注点实现),以获取最后一次审核并保存租户id: def after_audit audit = Audit.last audit.tenant_id = self.tenant_id audit.save! end 虽然这

我已经安装和工作了。用户id已成功保存在审核表中,但我无法找到一种有效的方法来保存租户id(我使用范围设置了多租户)。我曾尝试使用自述文件中描述的相关审计技术,但这对我来说并不适用

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

def after_audit
  audit = Audit.last
  audit.tenant_id = self.tenant_id
  audit.save!
end
虽然这是可行的,但再次查询审计并更新它似乎是低效的。对我来说,在保存之前将租户id添加到审计中会更有意义,但我不知道怎么做。是否可以在保存之前将租户id添加到审核中?如果是的话,怎么办

编辑:

我还尝试将默认租户范围包括在审计模型中,但似乎没有调用:

audit.rb

class Audit < ActiveRecord::Base
 default_scope { where(tenant_id: Tenant.current_id) }
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
在这段代码中,我们得到了当前模型的最后一次审核。这样,我们只处理当前模型,不可能将审计添加到其他业务(据我所知)。我会将此代码添加到关注点中以保持其干燥


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

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

t.references :org, type: :uuid, index: true, null: true
为了保存一个组织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

希望这有帮助

Marklar,你找到解决这个问题的方法了吗?@yaru没有,很遗憾我没有。我已经更新了我的问题,说明了我目前将如何实现,但我仍然对解决方案不满意。如果你明白了,请给我一个答案。谢谢
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