Der Standardbereich ignoriert den dynamischen Wert in der Bedingung
-
11-12-2019 - |
Frage
In meinem Aktivitätsmodell habe ich einen Standardbereich:
default_scope where(:subject_id => Log.get_subject_id)
Das Problem liegt in Log.get_subject_id, der Standardwert ist 0.Hier ist mein Log-Modell:
@@subject_id = 0
def self.set_subject_id(val)
@@subject_id = val
end
def self.get_subject_id
@@subject_id
end
Wenn ich den Wert von @@subject_id über Log.set_subject_id(10) im Controller ändere und dann Activity.all ausprobiere, erhalte ich immer ein schlechtes Ergebnis.SQL:
SELECT "activities".* FROM "activities" WHERE "activities"."subject_id" = 0
Wo liegt ein Problem?Danke!
Lösung
Mit dieser Form von default_scope
, dein Log.get_subject_id
Der Aufruf wird beim Parsen der Klasse ausgewertet, sodass Sie in Wirklichkeit etwa Folgendes sagen:
default_scope where(:subject_id => 0)
Sie können jedoch einen Block mit verwenden default_scope
die Evaluierung des Zielfernrohrs zu verzögern, bis Sie versuchen, es zu verwenden, und vermutlich Log.get_subject_id
wird einen nützlichen Wert haben:
default_scope { where(:subject_id => Log.get_subject_id) }
Andere Tipps
Es geschieht aufgrund des Umfangs-Cachings, versuchen Sie es mit Lambda zu wecken: generasacodicetagpre.