Rails: ITS, herencia y recarga! error en el entorno de desarrollo

Creado en 2 ene. 2013  ·  3Comentarios  ·  Fuente: rails/rails

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">] 
activerecord

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:

# 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.

Todos 3 comentarios

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)

¿Fue útil esta página
0 / 5 - 0 calificaciones