如何在同一个Ruby Rails项目中配置MongoMapper和ActiveRecord
我有一个现有的生产Ruby / Rails应用程序,我希望随着时间的推移迁移到MongoDB,因为它不是一次只能重写它的选项。 我希望能够在我找到它们时弃用我的旧课程。 我计划使用MongoMapper。 我找不到任何人解释如何设置数据库配置文件以允许连接到一个应用程序中的两个数据存储的示例。
FWIW,我正在使用Rails 3.我很感激帮助。
在你的Gemfile中包含你的mongo_mapper gem。 然后在您慢慢想要开始迁移到MongoMapper的模型中,您只需在模型中包含它:
include MongoMapper::Document
这是一个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
我的用户模型(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的大数据聚合和使用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个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
看起来不再需要上一个答案的初始化代码。 mongo_mapper将自己查找文件config/mongo.yml
并解析它并启动连接。 类似于ActiveRecord的database.yml
或Mongoid的monogoid.yml
。
Mongo映射器甚至附带一个Rails生成器来为您设置此文件。 你所要做的就是:
rails g mongo_mapper:config
这导致:
defaults: &defaults host: 127.0.0.1 port: 27017 development: <<: *defaults database: db_name_development ...
当然,如果他们在自述文件或doc网站上提到这一点会很好。 我正在使用mongo_mapper
版本0.10.1