Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Modifies ActiveRecord 3.0.x with the ability to store the actual class (instead of the base class) in polymorhic _type columns when using STI
Branch: master
Failed to load latest commit information.
lib Initial Attempt at 3.1 patch
test Taking into account changes related to interpolate_sql and santize_sq…
LICENSE.txt Initial version
Rakefile Learning how to make rdoc
VERSION Version bump to 0.1.3
polymorphic_and_sti_fix_for_rails_2.3-1.diff Added the polymorphic sti patch I was using for Rails 2.3.4 as reques…
polymorphic_and_sti_fix_for_rails_2.3-2.diff Added the polymorphic sti patch I was using for Rails 2.3.4 as reques…
store_base_sti_class_for_3_0.gemspec Regenerate gemspec for version 0.1.3



Given the following class definitions,

class Address
  belongs_to :addressable, :polymorphic => true

class Person
  has_many :addresses, :as => addressable

class Vendor < Person

and given the following code,

vendor = Vendor.create(...)
address = vendor.addresses.create(...)

p vendor
p address

will output,

#<Vendor id: 1, type: "Vendor" ...>
#<Address id: 1, addressable_id: 1, addressable_type: 'Person' ...>

Notice that addressable_type column is Person even though the actual class is Vendor.

Normally, this isn't a problem, however it can have negative performance characteristic in certain circumstances. The most obvious one is that a join with persons or an extra query is required to find out the actual type of addressable.

This gem add ActiveRecord::Base.store_base_sti_class configuration option. It defaults to true for backwards compatibility. Setting it false will alter ActiveRecord's behavior to store the actual class in polymorphic _type columns when STI is used.

In the example above, if the ActiveRecord::Base.store_base_sti_class is false, the output will be,

#<Vendor id: 1, type: "Vendor" ...>
#<Address id: 1, addressable_id: 1, addressable_type: 'Vendor' ...>


Add the following line to your Gemfile,

gem 'store_base_sti_class_for_3_0'

then bundle install. Once you have the gem installed, add the following to one of the initializers (or make a new one) in config/initializers,

ActiveRecord::Base.store_base_sti_class = false

When changing this behavior you will have write a migration to update all of your existing _type columns accordingly. You may also need to change your application if it explicitly relies on the _type columns.


The gem has been originally extracted out of patch. It allows the functionality to be used in applications that include Rails as a gem.

Currently, it works with Rails ~> 3.0.5.

This gem will not work with Rails 3.1 as much of its ActiveRecord internals have been replaced with Arel. Similar but different changes need to be applied to Rails 3.1. Those changes will come.

Still using Rails 2.3?

A patch for Rails 2.3 existed which I used until I switched to Rails 3 (sorry, I don't know the original author of that Rails 2.3 patch). I've attached that patch in form of two diffs to this repo. See polymorphic_and_sti_fix_for_rails_2.3-1.diff and polymorphic_and_sti_fix_for_rails_2.3-2.diff. Note, I was using Rails 2.3.4 so YMMV with 2.3.11.


Copyright © 2011 Paul Kmiec. See LICENSE.txt for further details.

Something went wrong with that request. Please try again.