Как настроить MongoMapper и ActiveRecord в одном проекте Ruby Rails - PullRequest
7 голосов
/ 20 июля 2011

У меня есть существующее производственное Ruby / Rails-приложение, которое я хочу со временем перенести на MongoDB, если позволяет время, потому что нельзя просто переписать все сразу. Я хотел бы иметь возможность просто осудить мои старые классы, когда я доберусь до них. Я планирую использовать MongoMapper. Я не могу найти пример, где кто-нибудь объясняет, как настроить файлы конфигурации базы данных, чтобы разрешить подключение к обоим хранилищам данных в одном приложении.

FWIW, я использую Rails 3. Я ценю помощь.

Ответы [ 2 ]

6 голосов
/ 20 июля 2011

Включите ваш гем mongo_mapper в ваш Gemfile. Затем в моделях, которые вы хотите постепенно перейти на MongoMapper, вы просто включаете это в свою модель:

include MongoMapper::Document

вот пример монгольской модели издателя

class Publisher
  include MongoMapper::Document

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

Моя модель пользователя (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

Приятно то, что все ваши другие модели все еще используют ActiveRecord, поэтому вы можете использовать 2 разные базы данных, пока все не будет перенесено в Mongo. Это пример из того, что я использую. Агрегирование больших объемов данных с использованием MongoMapper и модели User с использованием 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

и создал инициализатор, который различает 2 БД:

/ Инициализаторы / 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
2 голосов
/ 04 января 2012

Похоже, что код инициализатора из предыдущего ответа больше не нужен. mongo_mapper самостоятельно ищет файл config/mongo.yml, анализирует его и запускает соединение. Похоже на ActiveRecord database.yml или Mongoid monogoid.yml.

Mongo mapper даже поставляется с генератором Rails, чтобы настроить этот файл для вас. Все, что вам нужно сделать, это:

rails g mongo_mapper:config

Это привело к:

defaults: &defaults
  host: 127.0.0.1
  port: 27017

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

Конечно, было бы неплохо, если бы они упомянули об этом в файле Readme или на сайте документации. Я использую mongo_mapper версия 0.10.1

...