I’m building an application that will require CouchDB’s mobile syncing feature.
So for each ‘account’ on the service I want to create a separate CouchDB database instance so that only this account’s data is synced.
I’m using CouchRest Model and Devise, which handles subdomain authentication via a separate users database.
However what is the correct way to connect to the appropriate database at runtime for each model?
A before_filter that sets up a named connection, then loops through each model and does something like this: ?
[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
(Pseudocode)
Assuming that the web server (Heroku) runs each request in a separate thread, this should mean that on each request, the database connection is changed dynamically.
Seems like there should be an easier way!
As a solution to question you can override the database method:
And then just subclass your models (Post, Tag, Comment) from this class.
With this trick all you need to do in controller is just call something like
But, beware that this approach will become a little messy when you’ll have several thousands of accounts (databases).