Forum: Ruby on Rails STI updating the :type attribute of an STI instance

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
nico i. (Guest)
on 2008-11-18 18:35
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
Frederick C. (Guest)
on 2008-11-18 19:06
(Received via mailing list)
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
nico i. (Guest)
on 2008-11-18 19:25
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
!
Frederick C. (Guest)
on 2008-11-18 19:28
(Received via mailing list)
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
nico i. (Guest)
on 2008-11-18 20:09
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
Daniel L. (Guest)
on 2008-11-19 21:16
(Received via mailing list)
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>
This topic is locked and can not be replied to.