ich eine Klasse ähnlich der folgenden haben:Catch-22: Schienen db Migration läuft nicht, wenn Klassenkonstanten db-Anrufe
class FruitKinds < ActiveRecord::Base
Apple = FruitKinds.find(:all).find { |fk|
fk.fruit_name == :apple.to_s
}
# ... other fruits
# no methods
end
Apple und andere spezifische Früchte werden als Standardwerte an anderer Stelle in meinem häufig verwendete Anwendung, so will ich ein handliches Mittel, auf sie in einer aufzählbaren, statischen Weise zu verweisen.
Allerdings gibt es ein Problem. Es gibt eine Datenbankmigration, um die Tabelle zu erstellen und sie mit der speziellen Fruits
wie Apple
zu füllen. Wenn die Datenbankmigration ausgeführt wird, um FruitKinds zu initialisieren, kann rake
nicht gestartet werden, da zuerst FruitKinds
geladen wird. Dies ruft dann die Datenbank auf, was natürlich fehlschlägt, da die FruitKinds-Tabelle noch nicht vorhanden ist.
Die Problemumgehung besteht darin, die FruitKinds :: * Felder während der Migration auskommentieren, aber das ist schrecklich und hacky. Was ist der beste Weg, dies zu tun?
Konntest du nicht selbst schreiben.Apple so dass es die db maximal einmal trifft? Sie könnten den Wert irgendwo in einem Feld speichern und einen attr_accessor haben. –
Ich habe Memoisierung als Übung für den Leser hinterlassen, aber da - ich habe den obigen Code geändert, um den Wert in einer Klassenvariablen zu speichern. – Avdi
BTW, einen Grund, warum Sie nicht nur 'FruitKinds.find_first_by_fruit_name (" apple ")' für den Fund verwenden? – Avdi