6

私は監査済み(以前の act_as_audited)のセットアップと作業を行っています。user_id は監査テーブルに正常に保存されましたが、tenant_id を保存する効率的な方法がわかりません (スコープを使用してマルチテナンシーをセットアップしています)。README に記載されている Associated Audits テクニックを使用してみましたが、うまくいきません。

私の現在の解決策は、すべてのモデル (Rails の問題で実装可能) でafter_auditコールバックを使用して、最後の監査を取得し、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

このコードでは、現在のモデルの最後の監査を取得します。このように、現在のモデルのみを扱っているため、監査を別のビジネスに追加する可能性はありません (私が知る限り)。このコードを懸念事項に追加して、DRY に保ちます。

通常の Rails コールバックを Audit モデル内で動作させることはまだできません。現時点で私が目にする唯一の方法は、gem のソース コードをフォークして変更することです。

4

2 に答える 2