Estoy reabriendo el número 868, ya que todavía está presente hoy.
He usado ruby-1.9.3-p362 y rieles 3.2.9
La única solución es requerir clases secundarias o usar config.cache_classes = true
> Support.all
=> []
> Employee
=> Employee(id: integer, type: string)
> Administrator
=> Administrator(id: integer, type: string)
> Support.all
=> [#<Administrator id: 1, type: "Administrator">, #<Employee id: 2, type: "Employee">]
Lo he reproducido en rails 4
Rails 4.0.0.beta
Ruby 1.9.3p194
1.9.3p194 :001 > Administrator.create
1.9.3p194 :003 > Employee.create
1.9.3p194 :008 > Support.all
Support Load (0.5ms) SELECT "users".* FROM "users" WHERE "users"."type" IN ('Support', 'Administrator', 'Employee')
=> #<ActiveRecord::Relation [#<Administrator id: 1, type: "Administrator">, #<Employee id: 2, type: "Employee">]>
1.9.3p194 :009 > reload!
Reloading...
=> true
1.9.3p194 :010 > Support.all
Support Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."type" IN ('Support')
=> #<ActiveRecord::Relation []>
Esta es una limitación conocida del uso de STI en modo de desarrollo con carga diferida de clases. Debe usar require_dependency
para que Rails conozca esas subclases, por ejemplo:
# app/models/support.rb
class Support < User
end
require_dependency 'administrator'
require_dependency 'employee'
Si tiene muchas de estas subclases, puede usar Dir[]
y una carpeta especial en app
para cargarlas todas, por ejemplo:
# app/models/user.rb
class User < ActiveRecord::Base
end
Dir["#{Rails.root}/app/users/*.rb"].each do |file|
require_dependency file
end
O una tercera alternativa es codificar la lista en Model.descendants
, por ejemplo:
# app/models/user.rb
class User < ActiveRecord::Base
def self.descendants
[Support, Administrator, Employee]
end
end
No he usado el último personalmente, pero debería funcionar.
Tengo este tipo de problema y no puedo hacer que funcione. Mis modelos son A, B (y más) <C, D (y más) <B.
Después de un cambio de código, obtengo "constante B no inicializada". Intenté require_dependency de varias maneras, pero realmente no sé 1) qué clase (s) requerir (B?), Y 2) dónde hacerlo.
Estos modelos están asociados con otros modelos de varias maneras, esto también podría tener un impacto en el orden de carga (por ejemplo, A pertenece_ a X, X tiene_muchas Bs y Cs)
Comentario más útil
Esta es una limitación conocida del uso de STI en modo de desarrollo con carga diferida de clases. Debe usar
require_dependency
para que Rails conozca esas subclases, por ejemplo:Si tiene muchas de estas subclases, puede usar
Dir[]
y una carpeta especial enapp
para cargarlas todas, por ejemplo:O una tercera alternativa es codificar la lista en
Model.descendants
, por ejemplo:No he usado el último personalmente, pero debería funcionar.