Single Table Inheritance

 Herencia de tablas con Rails :)
   por Nelson Rojas Núñez
  nelsonrojas.wordpress.com
class Ad < ActiveRecord::Base
El problema
                           Ads
                           -name
                           -body
                           -published

                                                  class Page < ActiveRecord::Base
                                                      Pages
  class Post < ActiveRecord::Base                     -name
  Posts                                               -body
  -name                                               -published
  -body
  -published



Las tres tablas apuntan a elementos diferentes, tienen los
mismos campos, pero usan 3 tablas en la base de datos.
Usando Single Table Inheritance
                      class Entry < ActiveRecord::Base
                           Entries
                           -name
                           -body
                           -published
                           -type




   class Ad < Entry     class Post < Entry           class Page < Entry

   Ad                   Post                         Page
Ejemplo
$ rails demo

demo$   ruby   script/generate   model entry name:string body:text published:boolean type:string
demo$   rake   db:migrate
demo$   ruby   script/generate   model post --skip-migration
demo$   ruby   script/generate   model ad --skip-migration
demo$   ruby   script/generate   model page --skip-migration




Las Clases
class Entry < ActiveRecord::Base
end

class Page < Entry
end

class Post < Entry
end

class Ad < Entry
end
Usemos la consola para probar
>> o = Post.new
>> #<Post id: nil, name: nil, body: nil, published: nil, type: "Post", created_at: nil, updated_at: nil>
>> o.name = "mi primer post"
>> o.body = "este es el cuerpo de mi primer post"
>> o.published = true
>> o.save

>> p = Page.new
>> #<Page id: nil, name: nil, body: nil, published: nil, type: "Page", created_at: nil, updated_at: nil>
>> p.name = "mi primera pagina"
>> p.body = "este es el cuerpo de mi primera pagina"
>> p.published = true
>> p.save

>> Entry.count
=> 2

>> Post.count
=> 1

>> Page.count
=> 1
Conclusiones

Lo bueno
 ● Permite realizar búsquedas en un único lugar para cosas
   diferentes.
 ● Menos código para mantención.
 ● Herencia elegante :)

Lo malo
 ● No es la panacea, por tanto no abusar de ella cuando los
   elementos requieren tratamientos diferentes. Una mala idea
   es hacer herencia con órdenes de compra, facturas y guías.
Enlaces

● http://juixe.com/techknow/index.php/2006/06/03/rails-single-
  table-inheritance/
● http://www.therailsway.com/2006/11/19/tracks-part-3

Single table inheritance

  • 1.
    Single Table Inheritance Herencia de tablas con Rails :) por Nelson Rojas Núñez nelsonrojas.wordpress.com
  • 2.
    class Ad <ActiveRecord::Base El problema Ads -name -body -published class Page < ActiveRecord::Base Pages class Post < ActiveRecord::Base -name Posts -body -name -published -body -published Las tres tablas apuntan a elementos diferentes, tienen los mismos campos, pero usan 3 tablas en la base de datos.
  • 3.
    Usando Single TableInheritance class Entry < ActiveRecord::Base Entries -name -body -published -type class Ad < Entry class Post < Entry class Page < Entry Ad Post Page
  • 4.
    Ejemplo $ rails demo demo$ ruby script/generate model entry name:string body:text published:boolean type:string demo$ rake db:migrate demo$ ruby script/generate model post --skip-migration demo$ ruby script/generate model ad --skip-migration demo$ ruby script/generate model page --skip-migration Las Clases class Entry < ActiveRecord::Base end class Page < Entry end class Post < Entry end class Ad < Entry end
  • 5.
    Usemos la consolapara probar >> o = Post.new >> #<Post id: nil, name: nil, body: nil, published: nil, type: "Post", created_at: nil, updated_at: nil> >> o.name = "mi primer post" >> o.body = "este es el cuerpo de mi primer post" >> o.published = true >> o.save >> p = Page.new >> #<Page id: nil, name: nil, body: nil, published: nil, type: "Page", created_at: nil, updated_at: nil> >> p.name = "mi primera pagina" >> p.body = "este es el cuerpo de mi primera pagina" >> p.published = true >> p.save >> Entry.count => 2 >> Post.count => 1 >> Page.count => 1
  • 6.
    Conclusiones Lo bueno ●Permite realizar búsquedas en un único lugar para cosas diferentes. ● Menos código para mantención. ● Herencia elegante :) Lo malo ● No es la panacea, por tanto no abusar de ella cuando los elementos requieren tratamientos diferentes. Una mala idea es hacer herencia con órdenes de compra, facturas y guías.
  • 7.
    Enlaces ● http://juixe.com/techknow/index.php/2006/06/03/rails-single- table-inheritance/ ● http://www.therailsway.com/2006/11/19/tracks-part-3