2011-04-26 34 views
4

一個數據庫中,我要建,這將需要CouchDB的移動同步功能的應用程序。的Rails +設計+ CouchDB的每個子域

因此,對於在服務的每個「帳戶」我想使這個帳號的數據同步創建一個單獨的CouchDB數據庫實例。

我使用CouchRest型號和設計,它通過一個單獨的用戶數據庫處理子域認證。

但是什麼是在運行時連接到相應的數據庫中每個模型的正確方法是什麼?

,設置了命名的連接,然後通過每個模型循環,並做一些事情像這樣的的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的)運行在獨立的線程的每個請求,這應該意味着對每個請求,數據庫連接是動態改變的。

好像應該有一個更簡單的方法!

回答

4

作爲解決問題您可以覆蓋數據庫的方法:

class OneDbPerAccountDocument < CouchRest::ExtendedDocument 

    def self.database 
    Account.current_database 
    end 
    ... 
end 

然後就是從這個類繼承你的模型(郵政,標籤,評論)。

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 

但是,要小心,這種做法將成爲一個有點亂,當你有幾千個賬戶(數據庫)。

+0

謝謝你。好的解決方案 – stef 2011-05-19 11:33:19

+0

@Vladimir這種方法線程安全嗎?你需要使用current_thread技巧嗎? – 2011-09-15 04:59:09

+0

有必要將current_database存儲在Thread.current中,除非您絕對確信它永遠不會從不同的線程中調用。上面的代碼只是爲了說明這個想法。 – Vladimir 2011-12-18 15:26:34