2010-04-13 2 views
2

Я конвертирую часть приложения рельсов в свое собственное приложение для синатра. У него есть некоторая многообещающая работа, и вместо того, чтобы миллион помогает в app.rb, я отделил часть этого на классы. Без доступа к рельсам я переписываю finder несколько методов и нуждаюсь в доступе к базе данных внутри моего класса. Каков наилучший способ совместного использования соединения с базой данных между вашим приложением и классом? Или вы порекомендовали бы толкать всю работу базы данных в свой класс и только установив там соединение?Совместное использование базы данных с включенными классами в приложении Sinatra

Вот что я имею в в app.rb

require 'lib/myclass' 

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

Я хочу, чтобы получить доступ к нему в Lib/myclass.rb

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

Я пытался несколько вещей, но ничего такого, что, кажется, работать достаточно хорошо, чтобы даже включить в качестве примера.

ответ

3

Предполагая, что вы не выполняете потоковую передачу, просто настройте соединение как глобальный var.

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 

Может быть разумным проверить настройки таймаута соединения или явно отключиться от сервера. Если вы обрабатываете множество запросов, у вас могут закончиться соединения до того, как они истекут время ожидания.

+0

Идеальный, именно то, что мне было нужно –

3

Ответ Тима Розенблатта будет восстановлен по каждому запросу. Это лучше сделать следующее в вашем приложении Синатры:

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

Это лучше использовать константу, чем глобальной переменной в этом случае.

+0

Вы бы передумали, если бы я сказал вам, что приложение будет обслуживать только один вызов api, который, как ожидается, сделает один запрос и сразу же закроет соединение? –

+2

Решение Sequel к этому вызову будет связано с блоком, который я бы сделал в действии Sinatra, а не в предыдущем. get ('...') do Sequel.connect ('mysql: // user: password @ host: port/db_name') do | db | ... конец конец –

+0

только что понял, что я был не очень ясен в своем комментарии к вашему ответу. единственный вызов api еще должен выполнить несколько запросов и перепрыгнуть через сложные обручи, прежде чем он вернет результат. Я понял, что вы должны понимать, что db будет подключаться к каждому запросу (как при загрузке страницы). Это то, что вы имели в виду, или вы, возможно, имеете в виду, что соединение db будет восстановлено каждый раз, когда я вызываю глобальную переменную в моем коде? –

Смежные вопросы