ruby-on-rails – Rails设计CouchDB,每个子域有一个数据库
发布时间:2020-12-17 02:29:10 所属栏目:百科 来源:网络整理
导读:我正在构建一个需要CouchDB移动同步功能的应用程序. 因此,对于服务上的每个“帐户”,我想创建一个单独的CouchDB数据库实例,以便只同步此帐户的数据. 我正在使用CouchRest Model和Devise,它通过一个单独的用户数据库处理子域身份验证. 但是,在运行时为每个模
我正在构建一个需要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)在单独的线程中运行每个请求,这应该意味着在每个请求上,动态更改数据库连接. 好像应该有一个更简单的方法! 解决方法
作为问题的解决方案,您可以覆盖数据库方法:
class OneDbPerAccountDocument < CouchRest::ExtendedDocument def self.database Account.current_database end ... end 然后从这个类中继承您的模型(Post,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 但是,请注意,当您拥有数千个帐户(数据库)时,这种方法会变得有点混乱. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |