2010-04-13 3 views
2

Je convertis une partie d'une application rails en sa propre application sinatra. Il a un travail costaud à faire et plutôt que d'avoir un million d'aide dans l'application.rb, j'en ai séparé une partie dans les classes. Sans accès aux rails, je réécris plusieurs méthodes de finder et j'ai besoin d'accéder à la base de données à l'intérieur de ma classe. Quel est le meilleur moyen de partager une connexion de base de données entre votre application et une classe? Ou recommanderiez-vous de pousser tous les travaux de base de données dans sa propre classe et d'avoir seulement la connexion établie là?Partage d'une connexion de base de données avec les classes incluses dans une application Sinatra

Voici ce que j'ai dans app.rb dans

require 'lib/myclass' 

configure :production do 
    MysqlDB = Sequel.connect('mysql://user:[email protected]:port/db_name') 
end 

Je veux y accéder à lib/myclass.rb

class Myclass 
    def self.find_by_domain_and_stub(domain, stub) 
    # want to do a query here 
    end 
end 

J'ai essayé plusieurs choses mais rien qui semble travailler assez bien pour inclure même à titre d'exemple.

Répondre

3

En supposant que vous n'effectuez aucun thread, configurez simplement la connexion comme une variable globale.

require 'lib/myclass' 

before do 
    $MysqlDB = Sequel.connect('mysql://user:[email protected]:port/db_name') 
end 

class Myclass 
    def self.find_by_domain_and_stub(domain, stub) 
    # use $MysqlDB here 
    end 
end 

Il peut être judicieux de vérifier les paramètres de délai de connexion ou de se déconnecter explicitement du serveur. Si vous gérez un grand nombre de demandes, vous risquez de manquer de connexions avant leur expiration.

+0

parfait, exactement ce que je avais besoin –

3

La réponse de Tim Rosenblatt se reconnectera à chaque demande. Il est préférable de faire ce qui suit dans votre application Sinatra:

require 'sequel' 
DB = Sequel.connect('mysql://user:[email protected]:port/db_name') 
require 'lib/myclass' 

Il est préférable d'utiliser une constante d'une variable globale dans ce cas.

+0

voulez-vous changer d'avis si je vous ai dit que l'application ne servira pour un seul appel api qui devrait faire une demande unique et fermer la connexion juste après? –

+2

La solution Sequel à ce serait l'appel se connecter avec un bloc, ce que je ferais dans l'action Sinatra réelle, pas dans l'avant. get ('...') do Sequel.connect ('mysql: // utilisateur: mot de passe @ hôte: port/nom_bdd') do | db | ... fin fin –

+0

juste réalisé je n'étais pas très clair dans mon commentaire à votre réponse. l'appel unique d'api doit encore exécuter quelques requêtes et sauter à travers quelques cerceaux complexes avant qu'il renvoie le résultat. J'avais compris que vous vouliez dire que le db se reconnecterait à chaque requête (comme dans le chargement de la page). Est-ce que c'est ce que vous vouliez dire ou avez-vous voulu dire que la connexion db sera rétablie chaque fois que j'appelle la variable globale dans mon code? –

Questions connexes