私は監査済み(以前の 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 のソース コードをフォークして変更することです。