发布于 2015-09-14 15:14:27 | 141 次阅读 | 评论: 0 | 来源: 网络整理
It’s not difficult to use MongoDB with Rails 3. Most of it comes down to making sure that you’re not loading ActiveRecord and understanding how to use Bundler, the new Ruby dependency manager.
If you haven’t done so already, install Rails 3.
# Use sudo if your setup requires it
gem install rails
The important thing here is to avoid loading ActiveRecord. One way to do this is with the --skip-active-record switch. So you’d create your app skeleton like so:
rails new my_app --skip-active-record
Alternatively, if you’ve already created your app (or just want to know what this actually does), have a look at config/application.rb and change the first lines from this:
require "rails/all"
to this:
require "action_controller/railtie"
require "action_mailer/railtie"
require "active_resource/railtie"
require "rails/test_unit/railtie"
It’s also important to make sure that the reference to active_record in the generator block is commented out:
# Configure generators values. Many other options are available, be sure to check the documentation.
# config.generators do |g|
# g.orm :active_record
# g.template_engine :erb
# g.test_framework :test_unit, :fixture => true
# end
As of this writing, it’s commented out by default, so you probably won’t have to change anything here.
The final step involves bundling any gems you’ll need and then creating an initializer for connecting to the database.
Edit Gemfile, located in the Rails root directory. By default, our Gemfile will only load Rails:
gem "rails", "3.0.0
Normally, using MongoDB will simply mean adding whichever OM framework you want to work with, as these will require the “mongo” gem by default.
# Edit this Gemfile to bundle your application's dependencies.
source 'http://gemcutter.org'
gem "rails", "3.0.0"
gem "mongo_mapper"
However, there’s currently an issue with loading bson_ext, as the current gemspec isn’t compatible with the way Bundler works. We’ll be fixing that soon; just pay attention to this issue.
In the meantime, you can use the following work-around:
# Edit this Gemfile to bundle your application's dependencies.
require 'rubygems'
require 'mongo'
source 'http://gemcutter.org'
gem "rails", "3.0.0"
gem "mongo_mapper"
Requiring rubygems and mongo before running the gem command will ensure that bson_ext is loaded. If you’d rather not load rubygems, just make sure that both mongo and bson_ext are in your load path when you require mongo.
Once you’ve configured your Gemfile, run the bundle installer:
bundle install
Last item is to create an initializer to connect to MongoDB. Create a Ruby file in config/initializers. You can give it any name you want; here we’ll call it config/initializers/mongo.rb:
MongoMapper.connection = Mongo::Connection.new('localhost', 27017)
MongoMapper.database = "#myapp-#{Rails.env}"
if defined?(PhusionPassenger)
PhusionPassenger.on_event(:starting_worker_process) do |forked|
MongoMapper.connection.connect if forked
end
end
A slight modification is required to get rake test working (thanks to John P. Wood). Create a file lib/tasks/mongo.rake containing the following:
namespace :db do
namespace :test do
task :prepare do
# Stub out for MongoDB
end
end
end
Now the various rake test tasks will run properly. See John’s post for more details.
That should be all. You can now start creating models based on whichever OM you’ve installed.