Ich öffne die Ausgabe Nr. 868 wieder, da sie heute noch vorhanden ist.
Ich habe Ruby-1.9.3-p362 und Rails 3.2.9 verwendet
Die einzige Lösung besteht darin, untergeordnete Klassen zu erfordern oder 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">]
Ich habe es auf Schienen 4 . reproduziert
Rails 4.0.0.beta
Rubin 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 []>
Dies ist eine bekannte Einschränkung bei der Verwendung von STI im Entwicklungsmodus mit verzögertem Laden von Klassen. Sie müssen require_dependency
, um Rails auf diese Unterklassen aufmerksam zu machen, zB:
# app/models/support.rb
class Support < User
end
require_dependency 'administrator'
require_dependency 'employee'
Wenn Sie viele dieser Unterklassen haben, können Sie Dir[]
und einen speziellen Ordner in app
, um sie alle zu laden, zB:
# app/models/user.rb
class User < ActiveRecord::Base
end
Dir["#{Rails.root}/app/users/*.rb"].each do |file|
require_dependency file
end
Oder eine dritte Alternative besteht darin, die Liste in Model.descendants
hart zu codieren, zB:
# app/models/user.rb
class User < ActiveRecord::Base
def self.descendants
[Support, Administrator, Employee]
end
end
Letzteres habe ich persönlich noch nicht benutzt, aber es sollte funktionieren.
Ich habe so ein Problem und bekomme es nicht zum Laufen. Meine Modelle sind A, B (und mehr) < C, D (und mehr) < B.
Nach einer Codeänderung erhalte ich "nicht initialisierte Konstante B". Ich habe require_dependency auf verschiedene Weise versucht, weiß aber nicht wirklich 1) welche Klasse(n) benötigt werden (B?) und 2) wo es zu tun ist.
Diese Modelle sind auf verschiedene Weise mit anderen Modellen verbunden, dies kann sich auch auf die Ladereihenfolge auswirken (z. B. A gehört_zu X, X hat_viele Bs und Cs)
Hilfreichster Kommentar
Dies ist eine bekannte Einschränkung bei der Verwendung von STI im Entwicklungsmodus mit verzögertem Laden von Klassen. Sie müssen
require_dependency
, um Rails auf diese Unterklassen aufmerksam zu machen, zB:Wenn Sie viele dieser Unterklassen haben, können Sie
Dir[]
und einen speziellen Ordner inapp
, um sie alle zu laden, zB:Oder eine dritte Alternative besteht darin, die Liste in
Model.descendants
hart zu codieren, zB:Letzteres habe ich persönlich noch nicht benutzt, aber es sollte funktionieren.