STI updating the :type attribute of an STI instance


#1

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


#2

Frederick C. wrote:

On Nov 18, 4:35�pm, nico Itkin removed_email_address@domain.invalid
wrote:

=> #<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

I had found update_attribute_with_validation_skipping which updates the
protected attribute , but becomes is really what i need !! thanks a lot
!


#3

On Nov 18, 4:35 pm, nico Itkin removed_email_address@domain.invalid
wrote:

=> #<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


#4

On Nov 18, 5:25 pm, nico Itkin removed_email_address@domain.invalid
wrote:

Frederick C. wrote:

I had found update_attribute_with_validation_skipping which updates the
protected attribute , but becomes is really what i need !! thanks a lot
!

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


#5

Frederick C. wrote:

On Nov 18, 5:25�pm, nico Itkin removed_email_address@domain.invalid
wrote:

Frederick C. wrote:

I had found update_attribute_with_validation_skipping which updates the
protected attribute , but becomes is really what i need !! thanks a lot
!

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

Realize that later, get mad cause update_attribute was not working

thanks for the explanation

nico


#6

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

On Nov 18, 4:09 pm, nico Itkin removed_email_address@domain.invalid