2011-07-20 12 views
7

Tengo una producción existente de Ruby/Rails aplicación que quiero migrar a MongoDB con el tiempo, como el tiempo lo permite, porque no es una opción para simplemente volver a escribir todo de una una vez. Me encantaría poder dejar de lado mis viejas clases cuando llegue a ellas. Planeo usar MongoMapper. No puedo encontrar un ejemplo en el que alguien explique cómo configurar los archivos de configuración de la base de datos para permitir la conexión a ambos almacenes de datos dentro de una aplicación.Cómo configurar MongoMapper y ActiveRecord misma rieles Rubí Proyecto

Fwiw, estoy usando Rails 3. Agradezco la ayuda.

Respuesta

6

Incluya su joya mongo_mapper en que Gemfile. Luego, en los modelos que lentamente desea empezar a migrar a MongoMapper, que acaba de incluir esto en su modelo:

include MongoMapper::Document 

aquí es un ejemplo de un modelo editorial Mongo

class Publisher 
    include MongoMapper::Document 

    key :_id, String 
    key :mtd_uniques, Integer 
    key :mtd_demo_uniques, Integer 
    key :archive, Array 
    key :ignore, Boolean 
end 

Mi modelo de usuario (postgres):

class User < ActiveRecord::Base 
    validates_presence_of :first_name, :last_name, :email, :type 
    acts_as_authentic 

    def self.inherited(child) 
    child.instance_eval do 
     def model_name 
     User.model_name 
     end 
    end 
    super 
    end 
end 

lo bueno de esto es que todos sus otros modelos siguen utilizando ActiveRecord esta manera puede utilizar 2 bases de datos diferentes hasta que todo se haya migrado a Mongo. Este es un ejemplo de lo que estoy usando. Grandes agregaciones de datos utilizando MongoMapper, y el modelo de usuario que utiliza Postgres (aplicación alojada en Heroku)

Con mi configuración que vierten paquete de configuración en mi config.yml

development: 
    adapter: MongoDB 
    host: localhost 
    database: my-dev-db 

test: 
    adapter: MongoDB 
    host: localhost 
    database: my-dev-db 

staging: 
    adapter: MongoDB 
    host: remote-host (for me amazon ec2) 
    database: my-staging-db 

production: 
    adapter: MongoDB 
    host: remote-host (for me amazon ec2) 
    database: my-production-db 

y crearon un inicializador que diferencia entre los 2 DBs :

/initializers/database.rb

# load YAML and connect 
database_yaml = YAML::load(File.read("#{Rails.root}/config/config.yml")) 
puts "Initializing mongodb" 
if database_yaml[Rails.env] && database_yaml[Rails.env]['adapter'] == 'MongoDB' 
    mongo_database = database_yaml[Rails.env] 
    MongoMapper.connection = Mongo::Connection.new(mongo_database['host'], 27017, :pool_size => 5, :timeout => 5) 
    MongoMapper.database = mongo_database['database'] 
end 
+0

añadido archivos de configuración –

+1

Gracias @ Chris. Tuve que hacer un pequeño cambio: 'File.read (" # {Rails.root} /config/config.yml ")' Después de eso, funcionó. Muchas gracias por tomarse el tiempo para responder a esto y dejarlo tan claro. –

+0

Ah, claro! Establecí RAILS_ROOT como una constante. Me alegro de que funcionó. –

2

parece que el código de inicialización de la respuesta anterior ya no es necesaria. mongo_mapper buscará un archivo config/mongo.yml y lo analizará e iniciará la conexión. Similar a database.yml de ActiveRecord o monogoid.yml de Mongoid.

Mongo asignador incluso barcos con un generador de rieles para configurar este archivo para usted. Todo lo que tiene que hacer es:

rails g mongo_mapper:config 

Esto se ha traducido en:

defaults: &defaults 
    host: 127.0.0.1 
    port: 27017 

development: 
    <<: *defaults 
    database: db_name_development 
... 

Por supuesto que sería bueno si se mencionan en el presente Léame o en el sitio doc. Estoy usando la versión 0.10.1 mongo_mapper

+0

De acuerdo. Esta publicación es un poco vieja. En este momento estamos usando MongoDB para nuestros análisis, pero ni siquiera estamos usando MongoMapper. Creo que lo mejor es usar sólo el controlador de rubí mongo (https://github.com/mongodb/mongo-ruby-driver) y acaba de elaborar sus puntos de integración personalizados que necesita la aplicación. No es necesario engañar a ActiveRecord para que piense que los documentos mongo son objetos AR. –

Cuestiones relacionadas