我正在构建一个需要CouchDB移动同步功能的应用程序。
因此,对于服务中的每个“帐户”,我想创建一个单独的CouchDB数据库实例,以便只同步此帐户的数据。
我正在使用CouchRest Model和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
(伪代码)
假设Web服务器(Heroku)在单独的线程中运行每个请求,这意味着在每个请求上,数据库连接都会动态更改。
似乎应该有一种更简单的方法!
答案 0 :(得分:4)
作为问题的解决方案,您可以覆盖数据库方法:
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
但是,请注意,当您拥有数千个帐户(数据库)时,这种方法会变得有点混乱。