Using Mongoid with ActiveRecord

I’m trying to use mongodb and postgresql simultaneously with Rails
3.1. I believe I have everything set up correctly.

What I’m interested in knowing is how to get rails to flip-flop back-
and-forth between mongoid and activerecord.

For example, if I want to generate an ActiveRecord model after using
mongoid, rails automatically defaults to the Mongoid gem.

rails g model Blogpost
invoke mongoid
create app/models/blogpost.rb
invoke rspec
create spec/models/blogpost_spec.rb

How would I get rails to use ActiveRecord instead, and vice versa?

Thanks in advance


You could just go into the model and change it’s inheritance. I’ve
never used mongoid but I think that push comes to shove, simply
switching << [modeltype] wouldn’t be too hard. I’ll keep an eye open
for you though and see if I can figure it out.

Thanks Neener54, but I think I found the answer.

Instead of running:

rails g model Blogpost

I need to run

rails g active_record:model Blogpost

and that should generate all the ActiveRecord files, even though I
have mongoid installed.

However, now I am running into issues with migration and trying to use
the Devise plugin.

After installing the Devise plugin and auto-generating a User
ActiveRecord model using:

rails g active_record:devise User

I try to run my migrations. Here is the error output:

rake db:migrate
rake aborted!
undefined method `devise’ for User(Table doesn’t exist):Class

Tasks: TOP => db:migrate => environment
(See full trace by running task with --trace)

I tried the same flow in a separate project, except using only
ActiveRecord with no Mongoid and I was able to run migrations
successfully. Apparently, Mongoid is messing up my ActiveRecord
classes when I try to run rake.

Would anyone have a solution? For example, is there a similar way to
force rake to use ActiveRecord, such as when using rails-generate
(rails g active_record:***)?

By the way, I’m using ruby 1.9.2p290, Rails 3.1.0, Mongoid 2.3,
bson_ext 1.4, and devise 1.5.3.

Thanks in advance


Okay, I believe this is a bug in Devise.

When I generate the User model using:

rails g active_record:devise User

I get a config/initializers/devise.rb file with the following setting:

require ‘devise/orm/mongoid’

However, if I run “rails g active_record:devise User”, the setting
should actually be:

require ‘devise/orm/active_record’

I would expect the mongoid ORM to be used by devise if I ran

rails g devise user

without specifying “active_record”, but I didn’t.

Unless I’m missing something, this seems like a bug in Devise. I filed
a bug with the Devise team. Hopefully I’m not wrong and just wasting
people’s time.