加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

但是,请注意,当您拥有数千个帐户(数据库)时,这种方法会变得有点混乱.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读