Polymorphic Single Table Inheritance (STI)

March 30th, 2010

Migration:

create_table :addresses do |t|
....
t.references :addressable, :polymorphic => true
t.string :type
t.timestamps
end

Address Models:
class Address < ActiveRecord::Base
belongs_to :addressable, :polymorphic => true
end
class InvoiceAddress < Address
end
class DeliveryAddress < Address
end

User Model:
class User < ActiveRecord::Base
has_many :addresses, :dependent => :destroy
has_one :invoice_address, :as => :addressable
has_one :delivery_address, :as => :addressable
end

Order Model:

class Order < ActiveRecord::Base
has_many :addresses, :dependent => :destroy
has_one :invoice_address, :as => :addressable
has_one :delivery_address, :as => :addressable
end

Get Funky:

>> u = User.new
=> #<User id: nil ...>
>> u.build_invoice_address
=> #<InvoiceAddress id: nil, addressable_id: nil, addressable_type: "User", created_at: nil, updated_at: nil, type: "InvoiceAddress">
>> u.build_delivery_address
=> #<DeliveryAddress id: nil, addressable_id: nil, addressable_type: "User", created_at: nil, updated_at: nil, type: "DeliveryAddress">
>> o = Order.new
=> #<Order id: nil ...>
>> o.build_invoice_address
=> #<InvoiceAddress id: nil, addressable_id: nil, addressable_type: "Order", created_at: nil, updated_at: nil, type: "InvoiceAddress">

Sweet :)

Categories: activerecord

Tags: Leave a comment

Like This Post?

Subscribe for more...
Feed

http://www.mendable.com / Polymorphic Single Table Inheritance (STI)