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

7
我有一个现有的生产用Ruby/Rails应用程序,我想随着时间的推移逐步迁移到MongoDB,因为不可能一次性全部重写。我希望能够在处理旧类时将其弃用。我计划使用MongoMapper。我找不到任何示例来解释如何设置数据库配置文件以允许在一个应用程序中连接两个数据存储库。
顺便说一下,我正在使用Rails 3。感谢您的帮助。
2个回答

6

在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

我的用户模型(PostgreSQL):

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,因此在一切都迁移到Mongo之前,可以使用2个不同的数据库。这是我正在使用的一个示例。使用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

并创建了一个初始化器,区分了这两个数据库:

/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

1
谢谢@Chris。我不得不做一个小改变:File.read("#{Rails.root}/config/config.yml")之后,它就可以工作了。非常感谢您抽出时间回答这个问题并使其如此清晰明了。 - Adrian Carr
啊,对了!我已经将RAILS_ROOT设置为常量了。很高兴它能正常工作。 - Chris Barretto
1
嗨,Chris,很高兴你在玩这个。最近的版本中,配置和初始化器部分不再需要。请看下面我的回答。 - Wolfram Arnold

2
似乎前面的初始化代码不再需要了。mongo_mapper会自动查找文件config/mongo.yml并解析它以启动连接,类似于ActiveRecord的database.yml或Mongoid的mongoid.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版本。

同意。这篇文章有点老了。现在我们正在使用MongoDB进行分析,但甚至没有使用MongoMapper。我认为最好只使用mongo ruby driver(https://github.com/mongodb/mongo-ruby-driver),并且只需创建应用程序所需的自定义集成点即可。没有必要欺骗ActiveRecord认为mongo文档是AR对象。 - Chris Barretto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接