# Abstract\_class causes find to add "and foo."type" = 'Foo'"

**URL:** <https://www.ruby-forum.com/t/abstract-class-causes-find-to-add-and-foo-type-foo/120989>\
**Category:** Rails\
**Created:** [November 22, 2007, 1:05pm UTC](https://www.ruby-forum.com/t/abstract-class-causes-find-to-add-and-foo-type-foo/120989 "2007-11-22T13:05:36Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![joachimgross](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/258eb7/32.png) [@joachimgross](https://www.ruby-forum.com/u/joachimgross)\
**Post date:** [November 22, 2007, 1:05pm UTC](https://www.ruby-forum.com/t/abstract-class-causes-find-to-add-and-foo-type-foo/120989/1 "2007-11-22T13:05:36Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![joachimgross](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/258eb7/32.png) [@joachimgross](https://www.ruby-forum.com/u/joachimgross)\
**Post date:** [November 22, 2007, 2:55pm UTC](https://www.ruby-forum.com/t/abstract-class-causes-find-to-add-and-foo-type-foo/120989/2 "2007-11-22T14:55:18Z")

</div>

Joachim G. wrote:

> If this class is defined like this
> 
> 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](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.

–  
We develop, watch us RoR, in numbers too big to ignore.

---

<div class="post-metadata">

**Author:** ![joachimgross](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/258eb7/32.png) [@joachimgross](https://www.ruby-forum.com/u/joachimgross)\
**Post date:** [November 22, 2007, 3:05pm UTC](https://www.ruby-forum.com/t/abstract-class-causes-find-to-add-and-foo-type-foo/120989/3 "2007-11-22T15:05:43Z")

</div>

Mark Reginald J. wrote:

> 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.  
> Well, yes it should be never NULL, but I’ve plenty of those rows where  
> type is NULL (all created by Model#save).  
> I currently cannot reproduce the problem, but it seems to occour in  
> production mode. Maybe because schema info is not updated properly.
