[Rails] Re: Single Table inheitance doesn't show subclasses ?
Mark Reginald James
mrj at bigpond.net.au
Mon Jan 2 11:33:03 GMT 2006
Marcus Ob wrote:
> Suppose you have:
>
> ---
> class Animal < ActiveRecord::Base
> end
>
> class Mammal < Animal
> end
>
> class Cow < Mammal
> end
> ---
>
> I provide Animal,Mammal and Cow controllers with the scaffolding, just
> to test and to fill up the Animal table. I can see the "type" column
> getting it's value set with the class name.
> So far, soo good.
>
> Now, since listing Animals is showing all animals in the table
> (including Mammals and Cows) i thought that listing Mammals would show
> me all Mammals *and* Cows, but i see only recods marked "Mammal" in the
> "type" column (and no Cows).
>
> I understand that Rails doesn't select descendants of a class when
> listing it's elements, and i understand it could be more practical that
> way in most cases.
>
> But how can i tell Rails to build the query including in the selection
> also any descendants?
Perhaps something like this would work Marcus.
(Completely untested, may not work.)
class Animal < ActiveRecord::Base
@@branch = "'#{self.class.to_s}'"
def self.add_descendent( klass )
@@branch.concat( ",'#{klass.to_s}'" )
super unless self.equal?(Animal)
end
end
Put this inside all subclasses of Animal
@@branch = "'#{self.class.to_s}'"
superclass.add_descendent(self)
then use this SQL fragment to select objects of this class and
all subclasses:
"where type in (#@@branch)"
Or just create the branch string manually for each class.
--
We develop, watch us RoR, in numbers too big to ignore.
More information about the Rails
mailing list