I’m experiencing this exact behavior using STI
http://www.techlists.org/archives/programming/railslist/2005-12/msg00202.shtml
Here’s a concrete example. Say I have three classes that inherit
from
ActiveRecord, and I have one instance of each in my ‘animals’ table:
Dog < Mammal < Animal < ActiveRecord::Base
Run these command in order and you get:
Mammal.count() = 1
Dog.count() = 1
Mammal.count() = 2!
Here’s the SQL:
SHOW FIELDS FROM animals
SELECT COUNT() FROM animals WHERE ( (animals.type
= ‘Mammal’ ) )
SHOW FIELDS FROM animals
SELECT COUNT() FROM animals WHERE ( (animals.type
= ‘Dog’ ) )
SELECT COUNT(*) FROM animals WHERE ( (animals.type
= ‘Mammal’ OR
animals.type
= ‘Dog’ ) )
I noticed what’s making this happen is the ActiveRecord::Base
@@subclasses class variable handled by this attribute.
def subclasses
@@subclasses[self] ||= []
@@subclasses[self] + extra =
@@subclasses[self].inject([]) {|list, subclass| list |
subclass.subclasses }
end
Is there a way to “eager load” this variable with @@subclasses[Mammel]
= [Dog] so that whenever I do Mammel.find(:all), I’m also retrieving
records with Dog?
I could switch to polymorphic and it would probably make my
application more scalable, but I’d prefer to stay on one table to
maintain simplicity. This is madness and my head hurts. Anyone have
any suggestions?
Thanks
Kevin