マルチテナントの共有データベースアプリケーションでは、クエリ実行時にSQL条件の一部としてアカウントスコープを常に含むようにモデルを拡張する方法を探しています。理想的には、ActiveRecordを拡張して、関連するすべてのモデルにscoped_by_account
のようなものを含めることができます。レールでモデルを拡張して常に特定のスコープを含める方法
私はインターネットを検索し、これを行うと主張する1つのプラグインを見つけました。残念ながら、プラグインのスコープの検索部分は、私が知る限りでは機能していません。 (ここで見つけることができます:https://github.com/mconnell/multi_tenant)プラグインは、ActiveRecordのを拡張し、すべての検索で追加の検索条件「注入」に次のコードを使用しています。私が言うことができるものから、
def self.unscoped
...
super.apply_finder_options(:conditions => { account_id => Account.current.id })
end
が、これは適用に成功していません条件にすべて検索します。私がProject.all
を照会すると、現在のアカウントを無視してすべての結果が返されます。 Project.unscoped
を使用した場合にのみ正しく動作します。
私の質問:
どのように私はそれがそのモデルのために実行するすべてのクエリで私の追加条件を含めることはActiveRecordを拡張することができますか?お時間を
Thxを、 アーウィン
no。私たちのアプリでは、default_scopeをさまざまな他のもの(デフォルトソート順の設定など)に使用しています。私が探しているのは、低レベルでARを拡張して**そのモデルで実行される**クエリごとに条件を挿入することです。 – ErwinM
さて、そのモデルのデフォルトスコープにそれを含めないのはなぜですか?また、このテーブルに条件が含まれているかどうかを尋ねていますか? – Brad
はい。条件は常に含める必要があります。 default_scopeが機能しない理由は、できるだけ多くの場合オーバーライドする必要があるからです。次に、条件を手動で再入力することを心配する必要があります。それが私たちが低レベルを探している理由であり、それを含む安全な方法ではありません。もちろん、基本的なARファインダメソッドをオーバーライドできますが、より洗練されたソリューションを探していました。 – ErwinM