2013-04-03 2 views
1

Je travaille donc sur une application de rails multi-locataires utilisant des rails 3.2.11. Nous avons choisi l'approche du schéma, donc nous utilisons une seule base de données Postgres. Le schéma correct est chargé en fonction du sous-domaine. Nous avons ajouté la sécurité du côté de la base de données en créant un utilisateur de base de données pour chaque schéma qui dispose uniquement des autorisations pour accéder aux données dans son propre schéma.Application de rails multi-locataires avec plusieurs schémas

Tout mon code pour vérifier le sous-domaine et établir la connexion à la base de données appropriée est à l'intérieur d'une méthode before_filter dans mon contrôleur d'application.

Ma méthode change simplement le search_path puis j'utilise le ActiveRecord::Base.establish_connection suivant pour changer le nom d'utilisateur et le mot de passe de la base de données. J'ai écrit plusieurs tests et passé par l'application pour m'assurer que tout fonctionne correctement et que les données sont sauvegardées dans les schémas appropriés (même en utilisant plusieurs sous-domaines en même temps), jusqu'ici tout va bien.

Mais j'ai 2 grandes préoccupations que je voudrais poser des questions sur:

  1. J'utilise maintenant que ActiveRecord::Base.establish_connection appel à établir une connexion de base de données. Donc, par conséquent, je viens de supprimer tout mon code de mon fichier database.yml, et tout fonctionne toujours correctement. Mais ... je n'ai jamais fait quelque chose comme ça avant, y a-t-il une façon plus correcte de faire ça? Je suis inquiet cela peut causer quelques bogues ..

  2. Comme je l'ai dit plus tôt, une méthode before_filter est appelée pour établir la connexion de base de données appropriée. Mais comme je l'ai dit, j'utilise un before_filter, donc à chaque fois qu'un utilisateur change de page, la connexion est rétablie. Je crains que cela puisse causer des problèmes de performance, surtout au fur et à mesure que l'application se développe. Et aussi je ne suis pas sûr si je suis en train de négliger quelque chose et cela pourrait entraîner des bugs imprévus. Quelqu'un a-t-il eu une expérience avec ceci et pourrait offrir quelques conseils sur une approche comment manipuler ceci? Peut-être y a-t-il un moyen d'ajouter du code qui indique si une connexion de base de données initiale correcte est faite, puis ne rétablit pas la connexion à moins que le sous-domaine change?

Merci.

+0

Je peux vous garantir que la connexion établir à chaque demande aura un impact sévère de la performance. Ne faites pas cela :) Vous pouvez établir toutes les connexions dans un initialiseur (sur un activeecord sur le crochet de chargement par exemple) et essayer de changer la variable de connexion sur chaque demande? En outre, consultez http://stackoverflow.com/questions/2782758/creating-a-multi-tenant-application-using-postgresqls-schemas-and-rails?rq=1 – bbozo

Répondre

0

Cela pourrait vous être utile: https://github.com/influitive/apartment

mutualisée pour Rails 3 et ActiveRecord

Apartment propose des outils pour vous aider à gérer plusieurs bases de données dans votre application Rails. Si vous avez besoin de certaines données séquestrées en fonction du compte ou de la société, mais que certaines données existent encore dans une base de données commune , Apartment peut vous aider.

En outre, il y a une foule de questions de mutualisée ici sur le SO, les vérifier

Questions connexes