CTI in ActiveRecord

I search an plugin or gem, but don’t find nothing satisfactory. I
believe to be stranger a technology that nails the DRY, have that create
you vary equal tables, instead of using inheritance.

Exists an soluction for this? I want a solution similar to this:

create_table :people |t| do
t.column :name
t.column :address
end

create_table :customer |t| do
t.column :person_id
t.column :cpf
end

create_table :employee |t| do
t.column :person_id
t.column :wage
end

class Person < ActiveRecord::Base
end

clas Customer < Person
end

class Employee < Person
end

Cusotmer.name
Customer.cpf

Employee.name
Employee.wage

To my knowledge rails only supports STI or separate tables for each
subclass. If you make People abstract then each subclass will be in
its own tale.

The hybrid you show is not directly supported. You would need to
model them as associated tables. But, if you think about it that
makes sense. How would you expect a row in the employee table to
connect to a row in the people table? The best way is to add a
people_id to employee. That becomes a :belongs_to and you are all
set. You can always add support in Employee for delegating to the
associated people object so to the user they appear to be subclasses.

Michael

On May 28, 12:06 pm, Marcelo J. [email protected]

MichaelLatta wrote:

To my knowledge rails only supports STI or separate tables for each
subclass. If you make People abstract then each subclass will be in
its own tale.

The hybrid you show is not directly supported. You would need to
model them as associated tables. But, if you think about it that
makes sense. How would you expect a row in the employee table to
connect to a row in the people table? The best way is to add a
people_id to employee. That becomes a :belongs_to and you are all
set. You can always add support in Employee for delegating to the
associated people object so to the user they appear to be subclasses.

Michael

This is not inheritance, but relationship. What I want inheritance.

Some plugin or gem?

CTI = DRY

In Rails you can use STI very easily. The following example should
clearify things (from Agile Web D. with Rails, you should buy
the book at http://www.pragmaticprogrammer.com/ ):

create_table :people, :force => true do |t|
t.column :type, :string

common attributes

t.column :name, :string
t.column :email, :string

attributes for type=Customer

t.column :balance, :decimal, :precision => 10, :scale => 2

attributes for type=Employee

t.column :reports_to, :integer
t.column :dept, :integer

attributes for type=Manager

- none -

end

class Person < ActiveRecord::Base
end

class Customer < Person
end

class Employee < Person
belongs_to :boss, :class_name => “Employee” , :foreign_key
=> :reports_to
end

class Manager < Employee
end

Customer.create(:name => ‘John D.’ , :email =>
[email protected]” , :balance => 78.29)
wilma = Manager.create(:name => ‘Wilma Flint’ , :email =>
[email protected]” ,:dept => 23)
Customer.create(:name => ‘Bert Public’ , :email =>
[email protected]” ,:balance => 12.45)
barney = Employee.new(:name => ‘Barney Rub’ , :email =>
[email protected]” ,:dept => 23)
barney.boss = wilma
barney.save!

manager = Person.find_by_name(“Wilma Flint” )
puts manager.class #=> Manager
puts manager.email #=> [email protected]
puts manager.dept #=> 23

customer = Person.find_by_name(“Bert Public” )
puts customer.class #=> Customer
puts customer.email #=> [email protected]
puts customer.balance #=> 12.45

Regards,
Bas

Marcelo J. wrote:

I search an plugin or gem, but don’t find nothing satisfactory. I
believe to be stranger a technology that nails the DRY, have that create
you vary equal tables, instead of using inheritance.

Take a peek at http://clti.rubyforge.org/ . It’s still only for
PostgreSQL though.


Sava C.