[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