STI updating the :type attribute of an STI instance

Hi !

i've different users subclasses organised thanks to STI under a user
mother class, problem is that i can't find a way to exchange a user form
a certain type to an other , any light ???

class User < ActiveRecord::Base

end

class Guest < User
  has_and_belongs_to_many :hosts,
    :join_table => 'invitations'
end

class Host < User
  has_and_belongs_to_many :guests,
    :join_table => 'invitations'
end

#i'd like to change a Guest user to make him become Host :

g = Guest.first

=> #<Guest id: 418519017, type: "Guest", ...#>
g.update_attributes!(:type=>'Host')
=> true

g

=> #<Guest id: 418519017, type: "Guest", ...#>

#It seems that this "type" attribute is protected is there a way to
by-pass this ?

you can find the pastie of the above code here :
http://pastie.org/317885

=> #<Guest id: 418519017, type: "Guest", ...#>
g.update_attributes!(:type=>'Host')
=> true>> g

=> #<Guest id: 418519017, type: "Guest", ...#>

#It seems that this "type" attribute is protected is there a way to
by-pass this ?

Yup (and if you check your logs you'd probably see a warning about not
being able to mass assign a protected attribute)

There's two things you can play with: Directly setting the type
attribute or playing with the becomes method.

Fred

Frederick Cheung wrote:

You don;t need to dig that deep even for updating the attribute - just
foo.type = 'Blah' would do it.
Mass protection just means that it's ignored if you do
update_attributes, create, new or things like that.

Fred

Frederick Cheung wrote:

I guess it is not the right thing to do. You should use something like
roles and change it, not inheritance.