質問

私は、マルチユーザー、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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top