On Sep 17, 8:44 am, Matt Jones <al2o...@gmail.com> wrote:
> On Sep 16, 1:52 pm, Eric <ericgh...@gmail.com> wrote:
>
> > I have been working on a polymorphic STI schema where the inheriting
> > classes have associations:
>
> > class Asset < ActiveRecord::Base
> > end
>
> > class Sound < Asset
> >   belongs_to :user, :polymorphic => true
> > end
>
> > class User < ActiveRecord::Base
> >   has_many :sounds
> > end
>
> > The Asset class contains a 'type' attribute which is getting properly
> > populated with the inheriting class's name, so that's fine, but I was
> > getting an error that there was no 'user_type':
>
> > undefined method `user_type' for #<Sound:0x4cf3740>
>
> > OK, so I added 'user_type' to the Asset model and I can get past that
> > error (which was only raised upon a :destroy for the object). However,
> > now that I've added it, the user_type is not being populated when new
> > objects are created/saved. Am I missing something?
>
> The :polymorphic and the user_type field aren't necessary -
> polymorphic associations are used when you've got objects from
> multiple tables that all might be associated to a record, eg:
>
> class Foo < AR::Base
>   belongs_to :things, :polymorphic => true
> end
>
> class ThingA < AR::Base
>   has_many :foos, :as => :thing
> end
>
> class ThingB < AR::Base
>   has_many :foos, :as => :thing
> end
>
> Note that ThingA and ThingB are in seperate tables - if they were
> related via STI the :polymorphic wouldn't be needed.

Thanks for the reply, and I did leave a part out of my schema. There
will be other models inheriting from Asset, such that ultimately there
will be (at least):

class Asset < ActiveRecord::Base
end

class Sound < Asset
  belongs_to :user, :polymorphic => true
end

class Video < Asset
  belongs_to :user, :polymorphic => true
end

class Image < Asset
  belongs_to :user, :polymorphic => true
end

class User < ActiveRecord::Base
  has_many [:sounds,:videos,:images]
end

The idea will be to have @user.videos, @user.images, etc., so the STI
will handle the media types, and the polymorphism is used for User's
relationship to each. However, currently user_id is not being saved
through the association, and even if I manually set user_id in Asset
(and user_type, just for fun), Video.first.user comes up nil. So, STI
is working as expected, but the association is broken in some way that
leads me to wonder whether Asset needs some connection with User
(unlikely, given the docs and commentary I've been able to find), or
whether the STI classes need some more connections to the base class
in order for User to pass through the STI.

-eric

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to rubyonrails-talk@googlegroups.com
To unsubscribe from this group, send email to 
rubyonrails-talk+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to