Aus einer Datenbank wird ein Objekt der class A geladen.
In einer Objektvariablen t steht ein String, der den Namen einer
(definierten) Klasse "Beobachtung" darstellt. (Beobachtung ist von
ActiveRecord::Base abgeleitet.)
Es wird folgender after_find - Filter ausgeführt:
1 | after_find do |f|
|
2 | # f.t == "Beobachtung"
|
3 |
|
4 | f.t = eval(f.t)
|
5 |
|
6 | # f.t sollte jetzt class<Beobachtung> sein,
|
7 | # ist aber immer noch "Beobachtung"
|
8 | end
|
Wenn ich einen Haltepunkt in den Filter setze und den Befehl
f.t = eval(f.t)
in byebug ausführe und anschließend p f.t eingebe, wird das Class-Objekt
angezeigt, dessen Name zu Beginn in f.t stand.
Wenn ich den Filterausdruck unter rails ausführen lasse, enthält f.t
anschließend nicht das Class-Objekt, sondern den String.
Besonders irritiert mich, dass die Konstruktion
1 | v = "Beobachtung"
|
2 | v = eval(v)
|
unter Rails 3 mit ruby 1.8.7 wie gedacht funktioniert: v enthält
hinterher das Class-Objekt
Was ist da los?
Nachtrag:
Wenn ich im after_find-Filter probeweise
schreibe, ist f.t nach Ausführung des Befehls unverändert - es liegt
also nicht an eval, sondern an der Zuweisung.