Rails: STI, Vererbung und Nachladen! Fehler in der Entwicklungsumgebung

Erstellt am 2. Jan. 2013  ·  3Kommentare  ·  Quelle: rails/rails

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

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:

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

Alle 3 Kommentare

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)

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen