Forum: Ruby on Rails Single Table inheitance doesn't show subclasses ?

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.
Marcus O. (Guest)
on 2006-01-01 20:40
Hi, I am a Rails noob.

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?

thanks,
Happy new year,
Marcus.
(sorry for my poor english)
Mark Reginald J. (Guest)
on 2006-01-02 13:33
(Received via mailing list)
Marcus Ob wrote:

> end
> "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.
Marcus O. (Guest)
on 2006-01-02 14:22
Hi Mark,
Thank you for the example!

Best,
Marcus.
Scott W. (Guest)
on 2006-01-04 23:00
(Received via mailing list)
On Jan 1, 2006, at 10:40 AM, Marcus Ob wrote:

> end
> that
> way in most cases.

Actually, Rails _does_ select Mammals and Cows, but only if the
current Ruby interpreter knows about Cow (i.e., has loaded the Cow
class). The simplest workaround is to make sure that you reference
Cow before running your query.

There's an example with a test case here: http://butlerpress.com/sti.zip

Scott
This topic is locked and can not be replied to.