[Ror-es] #include en ruby

Xavier Noria fxn at hashref.com
Sat Sep 23 12:38:36 GMT 2006


On Sep 23, 2006, at 12:58 PM, Sebastian Delmont wrote:

> porque la herencia en activerecord implica "single table  
> inheritance", donde todas las subclases usan la misma tabla del padre.

No necesariamente, ese es el motivo por el cual hay que poner  
self.abstract_class = true como se apunto. Adjunto una demostracion  
abajo donde dos modelos tienen una clase abstracta comun, con metodos  
comunes heredados, pero viven en distintas tablas.

El problema que creo ver es que al ejecutar metodos estaticos como  
has_many self es la clase abstracta (esas lineas se evaluan al  
interpretar el codigo de creacion de la clase, no cuando la herencia)  
y por tanto la clave foranea por defecto no es hijo_id, sino  
abstract_id, necesita configuracion. Si no funciona supongo que  
quiere un nombre de llave distinto por hijo, por lo que entonces  
has_many no puede aprovecharse de ese modo.

-- fxn


fxn at feynman:~/tmp/abstract$ cat db/migrate/001_initial_schema.rb
class InitialSchema < ActiveRecord::Migration
   def self.up
     create_table :foos do |t|
       t.column :a, :string
     end
     create_table :bars do |t|
       t.column :b, :string
     end
   end

   def self.down
   end
end

fxn at feynman:~/tmp/abstract$ cat app/models/*.rb
class Abstract < ActiveRecord::Base
   self.abstract_class = true

   def c
     "c"
   end
end
class Bar < Abstract
end
class Foo < Abstract
end

fxn at feynman:~/tmp/abstract$ script/console
Loading development environment.
 >> f = Foo.create(:a => "a")
=> #<Foo:0x243e8a0 @errors=#<ActiveRecord::Errors:0x26e68b4 @errors= 
{}, @base=#<Foo:0x243e8a0 ...>>, @attributes={"a"=>"a", "id"=>1},  
@new_record=false>
 >> b = Bar.create(:b => "b")
=> #<Bar:0x26db7fc @errors=#<ActiveRecord::Errors:0x26d56e0 @errors= 
{}, @base=#<Bar:0x26db7fc ...>>, @attributes={"b"=>"b", "id"=>1},  
@new_record=false>
 >> f.c
=> "c"
 >> b.c
=> "c"
 >> Foo.find(:all)
=> [#<Foo:0x26c36c0 @attributes={"a"=>"a", "id"=>"1"}>]
 >> Bar.find(:all)
=> [#<Bar:0x26be38c @attributes={"b"=>"b", "id"=>"1"}>]



More information about the Ror-es mailing list