2009-04-06 5 views
10

Je suis en train de mettre en place un site Web de style SaaS dans lequel plusieurs clients géreront tous leurs workflows et données sur le même site - et donc la même base de données. Je ne suis même pas sûr s'il y a un mot pour ce concept, mais existe-t-il un moyen établi de ségrégation automatique des données de sorte que tous les appels ActiveRecord à la base de données sont filtrés/restreints par le client_id correct de l'utilisateur qui est connecté? Le moyen le plus simple serait bien sûr d'ajouter simplement un "where client_id = ?" et de mettre l'identifiant client de l'utilisateur ... à la fin de chaque requête ActiveRecord.Quelle est la meilleure méthode pour créer des "jardins clos" pour plusieurs clients dans votre base de données?

Y a-t-il une idée de filtre avant pour les modèles, de sorte que toute méthode de recherche (y compris les méthodes dynamiques) les inclurait automatiquement sur le client_id ?. Donc, je pourrais juste faire Model.find_by_what_I_want(foo), et il serait automatiquement savoir pour limiter cela aux seuls enregistrements appartenant à l'ID client correct, même si je ne l'ai pas spécifié explicitement?

+0

Quel SGBD utilisez-vous? –

+0

Would ** [multitenancy] (http://en.wikipedia.org/wiki/Multitenancy) ** est le mot pour ce concept? –

Répondre

10

Si vous utilisez Rails 2.3+, vous avez le luxe de champs par défaut:

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

Vous auriez à faire est réglé que client_id quelque part dans le processus d'initialisation.

Cela garantirait que toutes les requêtes db dans ce modèle utilisent la condition client_id.

+0

Parfait! Merci –

+0

J'utiliserais un Hash pour les conditions Hash, qui assure également que les enregistrements nouvellement créés recevraient l'ID correct automatiquement: default_cope: conditions => {: client_id => client_id} –

0

Que diriez-vous d'ajouter une nouvelle base de données pour chaque client? De cette façon, la séparation du client est plus concrète, et les erreurs, où les clients pourraient avoir des données d'autres clients, sont moins probables.

Questions connexes