如何在同一个Ruby Rails项目中配置MongoMapper和ActiveRecord

Adr*_*arr 7 ruby mongodb mongomapper ruby-on-rails-3

我有一个现有的生产Ruby/Rails应用程序,我希望随着时间的推移迁移到MongoDB,因为它不是一次只重写它的选项.我希望能够在我找到它们时弃用我的旧课程.我计划使用MongoMapper.我找不到任何人解释如何设置数据库配置文件以允许连接到一个应用程序中的两个数据存储的示例.

FWIW,我正在使用Rails 3.我很感激帮助.

Chr*_*tto 6

在你的Gemfile中包含你的mongo_mapper gem.然后在您慢慢想要开始迁移到MongoMapper的模型中,您只需在模型中包含它:

include MongoMapper::Document
Run Code Online (Sandbox Code Playgroud)

这是一个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
Run Code Online (Sandbox Code Playgroud)

我的用户模型(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
Run Code Online (Sandbox Code Playgroud)

关于这一点的好处是,所有其他模型仍然使用ActiveRecord,因此您可以使用2个不同的数据库,直到所有内容都迁移到Mongo.这是我正在使用的一个例子.使用MongoMapper的大数据聚合和使用postgres的用户模型(在Heroku上托管的应用程序)

对于我的设置,我在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
Run Code Online (Sandbox Code Playgroud)

并创建了一个区分2个DB的初始化程序:

/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
Run Code Online (Sandbox Code Playgroud)