Rails + Devise + CouchDB,每个子域有一个数据库

时间:2011-04-26 13:30:47

标签: ruby-on-rails ruby couchdb devise subdomain

我正在构建一个需要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)在单独的线程中运行每个请求,这意味着在每个请求上,数据库连接都会动态更改。

似乎应该有一种更简单的方法!

1 个答案:

答案 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

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