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:
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 ..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 unbefore_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.
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