[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