Rails + Devise + CouchDB с одной базой данных на поддомен - PullRequest
4 голосов
/ 26 апреля 2011

Я создаю приложение, для которого требуется функция мобильной синхронизации CouchDB.

Поэтому для каждой «учетной записи» в службе я хочу создать отдельный экземпляр базы данных CouchDB, чтобы синхронизировать только данные этой учетной записи.

Я использую CouchRest Model and Devise, которая обрабатывает аутентификацию поддоменов через отдельную базу данных пользователей.

Однако как правильно подключиться к соответствующей базе данных во время выполнения для каждой модели?

before_filter, который устанавливает именованное соединение, затем перебирает каждую модель и делает что-то вроде этого:?

[Post, Tag, Comment].each do |model|
  model_server = CouchRest::Server.new(couch_config[:connection])
  model_server.default_database = "my_project-#{Rails.env}-#{model.to_s.downcase}"    
  model.database = model_server.default_database
end

(псевдокод)

Предполагая, что веб-сервер(Heroku) запускает каждый запрос в отдельном потоке, это должно означать, что при каждом запросе соединение с базой данных изменяется динамически.

Похоже, должен быть более простой способ!

1 Ответ

4 голосов
/ 19 мая 2011

В качестве решения вопроса вы можете переопределить метод базы данных:

class OneDbPerAccountDocument < CouchRest::ExtendedDocument

  def self.database
    Account.current_database
  end
  ...
end

И затем просто создать подкласс для ваших моделей (Post, Tag, Comment) из этого класса.

class Account < OneDbPerAccountDocument

  def self.current=(name)
    @current_database = @couch_server.database("my-project_#{name}")
  end

  def self.current_database
    @current_database
  end

end

С помощью этого трюка все, что вам нужно сделать в контроллере, это просто вызвать что-то вроде

  Account.current = request.subdomain

Но учтите, что этот подход станет немного грязным, когда у вас будет несколькотысячи аккаунтов (баз данных).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...