4

私は、1 つのアカウントに n 人のユーザーを持つことができるマルチユーザー、マルチアカウントのアプリに取り組んでいます。すべてのユーザーが自分のアカウントからのみ情報にアクセスできることが非常に重要です。私のアプローチは、DB 内のすべてのモデルに account_id を追加し、すべてのコントローラーにフィルターを追加して、現在の account_id を持つオブジェクトのみを選択することです。認証プラグインを使用します。

このアプローチは良い考えですか?

書き込みなしで作成されたすべてのオブジェクトに常に account_id を設定する最良の方法は何ですか?

object.account = @current_account

すべての CREATE アクションで? もしかしてフィルター?

また、選択オプションのフィルターを実装する最良の方法についてもわかりません。一般的な条件のようなものが必要です。SQL ステートメントに他に何が表示されても、常に "WHERE account_id = XY" が存在します。

ご協力いただきありがとうございます!

4

4 に答える 4

4

これは User.has_many :emails シナリオに似ています。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])
于 2009-04-27T07:16:38.583 に答える
1

アカウントのスコープを常に気にする必要はないことを理解しています。正直に言うと、それはa**の痛みです。

少し魔法を加えて、このスコーピングをシームレスに行うには、次の宝石を見てください

http://gemcutter.org/gems/account_scopper

お役に立てれば、

-セバスチャン・グロジャン-ZenCocoon

于 2009-11-11T11:45:54.693 に答える
1

モデルでセッション変数またはインスタンス変数にアクセスする場合、MVC パターンを理解していないため、「PHP に戻る必要があります」。それでも、私たちのように、常に @current_account.object.do_something を書きたくない (あまり DRY ではない) コントローラーとアクションがたくさんある場合、これは非常に便利です。

私が見つけた解決策は非常に簡単です:

ステップ 1: current_account を Thread.current に追加します。たとえば、

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 を追加する場合は、同じアプローチを使用できます。

どう思いますか?

于 2009-04-27T07:59:05.440 に答える
1

2 番目の質問に答えるにdefault_scopeは、Rails 2.3 の新機能を調べてください。

于 2009-04-27T08:30:17.580 に答える