abstract_class causes find to add "and foo."type" = 'Foo'"

Joachim Glauche wrote:

rails 1.2.5

I've an abstract class as subclass of ActiveRecord::Base . Like this:

class SomeAbstractModel < ActiveRecord::Base   self.abstract_class = true end

I've a table Foo with a column "type", since I've subclasses of Foo.

If this class is defined like this class Foo < ActiveRecord::Base end

a simple select produces this query: # Foo.find(1) SELECT * FROM foo WHERE (foo."id" = 1)

If I change the superclass of Foo to my Abstract Model: class Foo < SomeAbstractModel end

the simple select produces now a different query # Foo.find(1) SELECT * FROM foo WHERE (foo."id" = 1) AND ( (foo."type" = 'Foo' ) )

This leads to my problem, since I've some rows where the type is NULL. Why does ActiveRecord behave like that? Well, Foo.superclass.abstract_class? returns true. Any thoughts?

I have a patch to remove abstract classes from STI find conditions:

   http://dev.rubyonrails.org/ticket/9694

However this is just for the efficiency boost. Your type field should never be NULL if you're only creating non-abstract classes in the STI hierarchy, unless it's a legacy issue.