2012-06-27 13 views
5

Tenemos una aplicación Rails 3 con una base de datos PostgreSQL (con ~ 10 tablas) mapeada por activerecord. Todo funciona bienMultiple Rails ORM

Sin embargo, también podríamos gustaría usar:

  • una base de datos MongoDB con el fin de almacenar imágenes (probablemente con mongoid joya).
  • a Neo4j base de datos (probablemente con neo4j-rails gema) en lugar de PostgreSQL para algunas tablas.

El uso de una base de datos con un Rails ORM es simple, gracias a database.yml. Pero cuando hay más de un ORM, ¿cómo podemos procesar? ¿Hay una buena manera de hacerlo? Por ejemplo, ActiveHash (y ActiveYaml) pueden funcionar bien con ActiveRecord. Creo que podría haber una posibilidad de permitir que diferentes ORM trabajen juntos. Gracias por cualquier consejo.

Respuesta

4

Esto realmente depende del tipo de ORM. Una excelente forma de hacerlo es mediante el uso de la herencia. Por ejemplo, puede tener múltiples bases de datos y adaptadores definidos en su archivo database.yml. Puede hablar fácilmente con ellos utilizando el método ActiveRecord establish_connection.

# A typical Active record class 
class Account < ActiveRecord::Base 
    ... 
end 

# A new database connection 
class NewConnection < ActiveRecord::Base 
    self.abstract_class = true 
    establish_connection "users_database" 
end 

# A new Active record class using the new connection 
class User < NewConnection 
    ... 
end 

El único aspecto negativo es que cuando estás conexión a múltiples bases de datos de registro migraciones activo puede llegar un poco arriesgado.

Mezcla

ORMS de mezcla de ORM es fácil. por ejemplo mongodb (con MongoId), simplemente no te heredan de registro activo e incluyen lo siguiente en el modelo que desea utilizar mongo:

class Vehicle 
    include Mongoid::Document 

    field :type 
    field :name 

    has_many :drivers 
    belongs_to :account 

end 

ORM construidos en la parte superior del modelo activo juegan muy bien juntos. Por ejemplo, con mongoid debería poder definir relaciones con los modelos de ActiveRecord, esto significa que no solo puede tener múltiples bases de datos, sino que puede comunicarse fácilmente a través del modelo activo.

1

En primer lugar, te recomiendo encarecidamente no tratar de tener múltiples ORM en la misma aplicación. Inevitablemente, querrás que tu objeto Mongoid se 'relacione' con tu objeto ActiveRecord de alguna forma. Y hay formas (ver más abajo) ... pero todas ellas eventualmente conducen al dolor.

Probablemente esté haciendo algo mal si cree que 'necesita' hacer esto. ¿Por qué necesita MongoDB para almacenar imágenes? Y si lo está usando solo como una tienda de imágenes, ¿por qué necesitaría Mongoid u otro ORM (o más exactamente, ODM)? Si realmente, realmente necesita agregar un segundo almacén de datos y un segundo ORM/ODM, ¿puede convertirlo en una aplicación separada y llamarlo como un servicio del primero? Piensa bien acerca de esto.

Dicho esto, si realmente quieres ir con "persistencia políglota" (no es mi término), hay una gema decente: https://github.com/jwood/tenacity. Ya no se desarrolla activamente, pero el mantenedor arregla errores y responde rápidamente a las consultas y solicitudes de extracción.

+0

Hola, yo fui tu comentario. Escuche, estaba pensando hacer lo mismo: tener un tipo de base de datos para el registro de usuarios y Neo4J para la lógica de negocios.¿Ahora crees que podría tener un mini Ror que solo se encarga del proceso de inicio de sesión y luego otro que solo se centre en la lógica comercial del producto? ¡Gracias! – YoniGeek