2017-03-03 2 views
0

Ich habe Klasse wie folgt definiert, und mir wurde gesagt, dass dies Probleme mit Autoload Rails verursachen kann. Was ist der Grund dafür? und wann sollten wir Class.new benutzen?Ruby MyClass = Class.new Autoloading Best Practice

class Integration < ActiveRecord::Base 
    MYobIdentifier = Class.new(Integration) 
end 
+2

besser sein Kapital Ich denke, wenn Sie diese beiden Links gehen, http://stackoverflow.com/questions/14739640/ruby-classes-within-classes -oder-Module-innerhalb-Module, http://urbanautomaton.com/blog/2013/08/27/rails-autoloading-hell/ erhalten Sie Ihre Antwort – Pramod

Antwort

1

Wenn eine Konstante (in diesem Fall Ihre Klassenname) Rubin nicht gefunden werden kann, dann wird er versuchen, zu finden Verwenden eines Dateinamens basierend auf dem Konstantennamen. In diesem Fall wird es für MYobIdentifier in einer Datei m_yob_identifier (Es gibt ein paar verschiedenen Orte es für diese Datei aussehen würde)

Solange Sie sicher sein können, genannt suchen, dass die Integration Klasse geladen wird, bevor jeder Versuch gemacht wird, ys MYobIdentifier dann wird es immer definiert und Sie müssen sich keine Sorgen machen.

Auch in Ihrem Fall, ich nehme an, Sie werden es als Integration::MYobIdentifier zugreifen in dem Fall Integration wird immer geladen werden, bevor Sie versuchen, die Konstante aufzulösen.

Anmerkung: Ich glaube, Sie würden die Klasse als MyObIdentifier

+0

Danke dafür. – user1883793

1

Als Stackoverflow in einem Kommentar Abdeckungen verknüpft Frage,

class A 
    class B 
    end 
end 

wird dies unter der Haube:

A = Class.new do 
    B = Class.new 
end 

Ein zusätzliches Detail Ihres Beispiel ist, dass eine andere Klasse Integration zu sein, ist als Argument an Class.new übergeben. Dies richtet die Vererbung ein. Sie können prüfen, ob eine Klasse von einer anderen erbt, indem Sie ClassA < ClassB; dies gibt true oder nil:

class A 
    class B 
    end 
end 
A::B < A 
# => nil 

class A 
    B = Class.new(A) 
end 
A::B < A 
# => true 

dieses zweite Beispiel das gleiche wie das ist:

class A 
    class B < A 
    end 
end 
A::B < A 
# => true