How to configure MongoMapper and ActiveRecord in same Ruby Rails Project

前端 未结 2 771
遥遥无期
遥遥无期 2020-12-30 14:28

I\'ve got an existing production Ruby/Rails app that I want to migrate to MongoDB over time, as time permits, because it\'s not an option to just rewrite it all at one time.

相关标签:
2条回答
  • 2020-12-30 14:39

    It looks like that the initializer code from the previous answer is no longer needed. mongo_mapper will on its own look for a file config/mongo.yml and parse it and start the connection. Similar to ActiveRecord's database.yml or Mongoid's monogoid.yml.

    Mongo mapper even ships with a Rails generator to set this file up for you. All you have to do is:

    rails g mongo_mapper:config
    

    This has resulted in:

    defaults: &defaults
      host: 127.0.0.1
      port: 27017
    
    development:
      <<: *defaults
      database: db_name_development
    ...
    

    Of course it would be nice if they mentioned this in the Readme or on the doc site. I'm using mongo_mapper version 0.10.1

    0 讨论(0)
  • 2020-12-30 14:48

    Include your mongo_mapper gem in you Gemfile. Then in the models that you slowly want to start migrating over to MongoMapper, you just include this in your model:

    include MongoMapper::Document
    

    here is an example of a Mongo publisher model

    class Publisher
      include MongoMapper::Document
    
      key :_id, String
      key :mtd_uniques, Integer
      key :mtd_demo_uniques, Integer
      key :archive, Array
      key :ignore, Boolean
    end
    

    My user model (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
    

    The nice thing about this is that all of your other models still use ActiveRecord so you can use 2 different databases till everything is migrated over to Mongo. This is an example from what I'm using. Large data aggregations using MongoMapper, and User model using postgres (app hosted on Heroku)

    For my setup I dumped config stuff in my 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
    

    and created an initializer that differentiates between the 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 讨论(0)
提交回复
热议问题