常にRailsのでアカウント-範囲の値を設定するには?
-
16-09-2019 - |
質問
私は、マルチユーザー、1つのアカウントがn個のユーザーを持つことができるマルチアカウントのAppに取り組んでいます。すべてのユーザーにのみ、そのアカウントからの情報にアクセスできることは非常に重要です。私のアプローチは、DB内のすべてのモデルにACCOUNT_IDを追加し、するすべてのコントローラにフィルタを追加するよりも、現在ACCOUNT_IDを持つオブジェクトを選択することです。私は、認可プラグインを使用します。
このアプローチは良いアイデアですか?
常に
を記述することなく作成されたオブジェクトごとにACCOUNT_IDを設定する最良の方法は何ですかobject.account = @current_account
すべての中には、アクションを作成しますか?たぶんフィルタ?
また、私はオプションを選択するためのフィルタを実装するための最良の方法についてはよく分かりません。私は一般的な条件のようなものが必要になります。どんなにSQL文で表示される他に何、常に存在しない「WHERE ACCOUNT_ID = XY」
あなたの助けをありがとう!
解決
このはUser.has_manyに似ています。あなたは、ユーザーがURLにIDを変更することによって、他の人々の電子メールを表示したくないので、あなたは、次の操作を行います。
@emails = current_user.emails
あなたのケースでは、あなたはおそらくこのような何かを行うことができます:
class ApplicationController < ActionController::Base
def current_account
@current_account ||= current_user && current_user.account
end
end
# In an imagined ProjectsController
@projects = current_account.projects
@project = current_account.projects.find(params[:id])
他のヒント
私は、私はあなたのモデルにセッション変数やインスタンス変数にアクセスする場合は、MVCパターンを理解していなかったし、「PHPに戻るべき」、知っている、知っています。私たちのような - - あなたが持っている場合しかし、それでもまだ、これは非常に便利である可能性があります。あなたはいつもcurrent_account.object.do_something(非常に乾燥していない)@書きたくないのコントローラとアクションの多くを
私が見つけた解決策は非常に簡単です。
ステップ1: Thread.currentにごcurrent_accountを追加するので、例えば
class ApplicationController < ActionController::Base
before_filter :get_current_account
protected
def get_current_account
# somehow get the current account, depends on your approach
Thread.current[:account] = @account
end
end
ステップ2: すべてのモデルにcurrent_accountメソッドを追加します。
#/lib/ar_current_account.rb
ActiveRecord::Base.class_eval do
def self.current_account
Thread.current[:account]
end
end
ステップ3:出来上がりは、ご使用のモデルにあなたがこのような何かを行うことができます:
class MyModel < ActiveRecord::Base
belongs_to :account
# Set the default values
def initialize(params = nil)
super
self.account_id ||= current_account.id
end
end
またactive_recordでbefore_validationコールバックのようなもので動作し、そのアカウントが常に設定されていることを確認、検証して作ることができます。
あなたは常にすべての作成されたオブジェクトにCURRENT_USERを追加したい場合は、同じアプローチを使用することができます。
あなたはどう思いますか?
、2番目の質問に答える新しい default_scope
にチェックアウトするにはRailsの2.3で機能ます。
私はあなたがすべての時間を占めるスコープについて気にしたくないことを理解しています。正直に言うことができます、それは** Aの痛みです。
次の宝石を見て与えるビットの魔法を追加すると、このスコープがシームレスに行われてきた。
http://gemcutter.org/gems/account_scopperする
この情報がお役に立てば幸い、
- セバスチャン・グロジャン - ZenCocoon