Angenommen, ich arbeite an einem MongoMapper Klasse, die wie folgt aussieht:Verwenden Sie im MongoMapper optionale Tasten oder einen Auffangschlüssel?
class Animal
include MongoMapper::Document
key :type, String, :required => true
key :color, String
key :feet, Integer
end
Jetzt möchte ich eine Flügelspannweite des Vogels speichern. Wäre es besser, dies zu schreiben, auch wenn es für viele Dokumente irrelevant ist und fühlt sich ein bisschen unsauber:
key :wingspan, Float
Oder das, obwohl es sich um ein indescriptive ist catch-all, die wie ein Hack fühlt:
key :metadata, Hash
Es scheint, als ob der: -Metadaten-Ansatz (für den es Präzedenzfälle in dem Code gibt, den ich vererbe) für das Mongo-Dokument als Ganzes fast überflüssig ist: Beide sollen schemalose Buckets von Schlüssel-Wert-Paaren sein.
Allerdings scheint es auch, dass das Hinzufügen von Tier-spezifischen Schlüsseln ein rutschiger Hang zu einem ziemlich hässlichen Modell ist.
Alle Alternativen (eine Bird-Unterklasse erstellen)?
Interessant - Ich habe gerade herum gespielt und bestätigt, dass undefinierte Schlüssel tatsächlich gespeichert und abgerufen werden. Also, was ist der Punkt der Definition von Schlüsseln in Ihrem Modell überhaupt (abgesehen von den Standardeinstellungen und: erforderlich => wahr)? – Ross
Nun, der 'Schlüssel'-Aufruf ist 'def my_attr' und' def my_attr = ', also kannst du' bird.wingspan' machen. Bei nicht definierten Schlüsseln wird 'key' erst aufgerufen, wenn ein Objekt _aus der Datenbank_ geladen wird. Wenn Ihre Anwendung also kalt ist (zB Tests), wird' Bird.new.wingspan' einen 'NoMethodError' auslösen, da' key: pingspan' hasn ist Es ist noch nicht geschehen. –