2009-04-06 2 views
10

私はSaaSスタイルのウェブサイトを構築しています。そこでは、複数のクライアントがすべて同じワークフローとデータを管理しています。つまり同じデータベースです。あなたのデータベースの中の複数のクライアントのための "壁の庭"を作成する最もよい方法は何ですか?

このコンセプトの単語があるかどうかはわかりませんが、データベースのActiveRecord呼び出しがユーザーの正しいclient_idによってフィルタリング/制限されるように、データを自動分離する確立された方法がありますそれはログインしていますか?

もちろん、「where client_id = ?」を追加して、ユーザーのクライアントIDを1つのActiveRecordリクエストごとに追加するだけの簡単な方法はあります。

モデルのフィルタのアイデアがあるので、どのような検索方法(動的なものも含む)が自動的にclient_idをタックしますか?だから私はちょうどModel.find_by_what_I_want(foo)を行うことができます、そして、それは私が明示的にそれを指定しなかったにもかかわらず、正しいクライアントIDによって所有されたレコードだけにそれを制限することを自動的に知っていますか?

+0

どのDBMSを使用していますか? –

+0

** [multitenancy](http://en.wikipedia.org/wiki/Multitenancy)**このコンセプトの言葉ですか? –

答えて

10

あなたがRailsの2.3以降を使用している場合は、デフォルトのスコープの贅沢を持っている:

class Model < ActiveRecord::Base 
    default_scope :conditions => ['client_id = ?', client_id] 
end 

あなたは確かclient_idのはどこかinitプロセスで設定されていることを確認する必要があると思います。

これは、そのモデル内のすべてのdbクエリがclient_id条件を使用することを保証します。

+0

パーフェクト!ありがとう –

+0

新しく作成されたレコードが正しいIDを自動的に受け取るように、ハッシュ条件にハッシュを使用します: default_scope:conditions => {:client_id => client_id} –

0

お客様ごとに新しいデータベースを追加することはどうですか?このようにして顧客を分離することはより具体的であり、顧客が他の顧客のデータにアクセスする可能性の低いエラーも少なくなります。

関連する問題