2011-06-30 13 views
21

Estoy usando rails 3 y comencé mi aplicación con ActiveRecord. Ahora, tengo muchos modelos, y las relaciones se empiezan a complicar, y algunas podrían expresarse más simplemente con una estructura orientada a documentos, así que me gustaría intentar migrar a MongoDB y usar Mongoid.¿Cómo puedo usar Mongoid y ActiveRecord en paralelo en Rails 3?

Siempre he oído que no tienes que usar todo MongoDB o nada, pero que puedes usar los dos en paralelo mientras migras. Sin embargo, no veo cómo hacerlo con los documentos.

Por ejemplo, tengo:

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 

Me gustaría comenzar idealmente mediante la sustitución de mi modelo activerecord artículo con un documento Mongoid, por lo que mis artículos se almacenan en MongoDB, y mi Users y Products puedo quedar en mi SQL DB

La cosa es, no veo cómo hacer esto. ¿Voy por esto de la manera correcta?

Quizás otra alternativa es mantener una base de AR artículo

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 

Gracias!

Respuesta

10

No veo ningún motivo por el que no pueda tener ambos modelos ActiveRecord y Mongoid en la misma aplicación. Una vez dicho esto, estoy casi seguro de que se encontrará con problemas si intenta crear relaciones entre sus modelos ActiveRecord y Mongoid.

Si sus modelos ActiveRecord están muy interrelacionados, pero se adaptan mejor a la estructura de un documento, entonces le sugiero que solo muerda la viñeta y los convierta a todos en documentos Mongoid. Tuve que hacer esto recientemente en un proyecto (grande) y es significativamente menos estresante de lo que piensas.

Si tiene buenas pruebas de unidad para sus modelos, entonces debería ser una instantánea total. Si no lo hace, primero escriba las pruebas de su unidad, asegúrese de que pasen con ActiveRecord y luego comience a migrar a Mongoid.

14

Lo que hice fue simular la relación con los métodos en cada modelo AR y el modelo Mongoid como tal.

# 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 

Por supuesto que no vamos a tener todos los métodos de AR en el modelo VisitSession Mongoid pero usted por lo menos ser capaz de burlarse de la relación entre los dos bastante bien.

Espero que esto ayude.

+0

Me gusta su enfoque ingenuo! ¿Tuviste algo así en producción? ¿Pasó la prueba a través del tiempo? –

+0

cualquier métrica de rendimiento de referencia? –

Cuestiones relacionadas