2011-06-30 19 views
21

我正在使用rails 3,並開始與ActiveRecord我的應用程序。現在,我有很多模型,關係開始變得複雜,有些可以更簡單地用面向文檔的結構來表示,所以我想嘗試遷移到MongoDB並使用Mongoid。如何在Rails 3中並行使用Mongoid和ActiveRecord?

我一直聽說你不需要使用所有的MongoDB或者什麼都不用,但是你可以在遷移的時候同時使用這兩個。儘管如此,我不知道如何從文檔中去解決這個問題。

例如,我有:

class User < ActiveRecord::Base 
    has_many :items 
    has_many :products, :through => :items 
end 

class Product < ActiveRecord::Base 
    has_many :items 
end 

class Item < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :product 

    # alot of data that fits a hierarchical document-oriented structure 
end 

我想最好用一個Mongoid文件替換我的項目ActiveRecord的模型開始,所以我的項目都存儲在MongoDB中,我的UsersProducts可以留在我的SQL DB

事情是,我不知道如何做到這一點。我是否以正確的方式去做這件事?

也許另一種選擇是保留基本AR項目

class Item < ActiveRecord::Base 
    has_one :mongodb_item ?? # I know this is wrong 
end 

class MongodbItem 
    include Mongoid::Document 
    belongs_to AR_Item ??? # I know this is also wrong 
end 

謝謝!

回答

10

我不明白爲什麼你不能有 ActiveRecord和Mongoid模型在同一個應用程序中。話雖如此,我幾乎可以肯定,如果你嘗試在你的ActiveRecord和Mongoid模型之間建立關係,你會遇到問題。

如果你的ActiveRecord模型是相互關聯的,但更適合於文檔結構,那麼我建議你只需咬住子彈並將它們全部轉換成Mongoid文檔。我最近不得不在一個(大型)項目上這樣做,而且它的壓力比你想象的要小得多。

如果您的模型具有良好的單元測試,那麼它應該是一個總捕捉。如果你不這樣做 - 首先編寫你的單元測試,確保他們通過ActiveRecord,然後開始遷移到Mongoid。

14

我所做的只是模擬與AR模型和Mongoid模型中的方法之間的關係。

# visit_session.rb 
class VisitSession 
    include Mongoid::Document 
    include Mongoid::Timestamps 

    field :user_id, type: Integer 
    index({user_id: 1},{name: :user_id_index}) 

    # Mock a belongs_to relationship with User model 
    def user 
    User.find(self.user_id) 
    end 
end 

# user.rb 
class User < ActiveRecord::Base 

    # Mock a has_many relationship with VisitSession Mongoid model 
    def visit_sessions 
    VisitSession.where(user_id: self.id) 
    end 
end 

當然,你不會對VisitSession Mongoid模型中的所有AR的方法,但你至少可以嘲笑兩者之間的關係相當好。

希望這會有所幫助。

+0

我喜歡你的天真的做法!你在生產中有類似的東西嗎?時間過去了嗎? –

+0

任何性能基準測量? –