Mongoid models provide an excellent level of abstraction. Consider a User model.
class User
include Mongoid::Document
devise :invitable, :database_authenticatable, ...
field :name, :type => String
field :email, :type => String
end
We have derived an _Admin _type from it.
class Admin < User
end
This avoids having to have an explicit user type. In the database the distinction will be the _type
field and correct objects are instantiated by querying auto-magically.
But how do we promote a User into an Admin?
We have to change the internal _type
field. So far I found only one way, reach down to MongoDB and update the field explicitly.
def self.promote!(user)
users = Mongoid.master.collection('users')
users.update( { :"_id" => user.id }, { :"$set" => { :"_type" => "Admin" }})
end
I feel dirty. Is there a better way?