Совместное использование подключения к базе данных с включенными классами в приложении Sinatra - PullRequest
2 голосов
/ 14 апреля 2010

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

Вот что у меня в app.rb

require 'lib/myclass'

configure :production do
  MysqlDB = Sequel.connect('mysql://user:password@host: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

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

Ответы [ 2 ]

3 голосов
/ 16 апреля 2010

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

require 'sequel'
DB = Sequel.connect('mysql://user:password@host:port/db_name')
require 'lib/myclass'

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

3 голосов
/ 14 апреля 2010

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

require 'lib/myclass'

before do
  $MysqlDB = Sequel.connect('mysql://user:password@host:port/db_name')
end

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

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

...