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.