Herencia? no, nomenclatura!

Tengo unos cuantos niveles de herencia:

contenido.rb - class Contenido < ActiveRecord::Base
tema.rb - class Tema < Contenido

Hasta aquí, bien… pero ahora añado otro nivel

thread.rb - class Thread < Tema

y ya no puedo hacer migraciones:
script/generate migration add_created_at_to_socios created_at:date

me sale error:
trunk/app/models/thread.rb:1: uninitialized constant Tema (NameError)

Supongo que no carga las clases en el orden correcto… así que le meto
un require ‘tema’ y me sale otro error
trunk/app/models/tema.rb:1: uninitialized constant Contenido.

Y le meto a tema un require ‘contenido’ y entonces se me queja de…
¡ActiveRecord! Pero borro thread.rb y todo vuelve a funcionar.

Conclusión: Thread debe ser una palabra reservada y usarla da problemas.
Ojo con los nombres de clases que pongáis en inglés, son ganas de
buscarse problemas!!

s2

Hola Fernando,

sí que hay unas cuantas palabras reservadas:

http://wiki.rubyonrails.org/rails/pages/ReservedWords

Además, supongo que llamar a una clase como una de las clases que
implementa Ruby también tiene que dar problemas.

Saludos!

2008/6/2 Fernando C. [email protected]:

2008/6/2 Fernando C. [email protected]:

thread.rb - class Thread < Tema
me sale error:
trunk/app/models/thread.rb:1: uninitialized constant Tema (NameError)

Thread es una clase core de Ruby (con la que se programan threads).
Como otras core (TrueClass, String, …) esa clase esta siempre
definida al arrancar el interprete, por tanto un “class Thread” esta
reabriendo esa clase.

Las clases en Ruby pueden reabrirse pero no esta permitido cambiar su
padre. Normalmente obtendrias este mensaje de error:

class C; end
class Thread < C; end

superclass mismatch for class Thread (TypeError)

Faltaria ver por que queda ese error escondido. Ruby debe resolver C
porque podria ser que estes usando el padre correcto, y en tu caso
saltaria Dependencies. Es posible que con todo el tinglado quede
enmascarado.