Ich habe das folgende Modell
%Vor%Wie kann ich Folgendes sicherstellen?
%Vor%d. Aufgabennamen sind innerhalb einer bestimmten Person eindeutig
Nachdem ich die Dokumente zu den Indizes ausgecheckt habe, dachte ich, dass das Folgende funktionieren könnte:
%Vor%aber
%Vor%erzeugt immer noch ein Duplikat.
Die oben in Person angezeigte Index-Konfiguration würde in mongodb übersetzt werden
%Vor%Indizes sind standardmäßig nicht eindeutig. Wenn Sie sich die Mongo Docs ansehen, ist die Eindeutigkeit eine zusätzliche Markierung.
Ich kenne die exakte Mongoid-Übersetzung nicht, aber Sie suchen nach etwas wie diesem:
db.things.ensureIndex({firstname : 1}, {unique : true, dropDups : true})
Können Sie nicht einfach einen Validator auf die Aufgabe setzen?
%Vor%Dies sollte die Eindeutigkeit innerhalb des übergeordneten Dokuments sicherstellen.
Ich glaube nicht, dass dies mit eingebetteten Dokumenten möglich ist. Ich stieß auf dasselbe Problem wie Sie und die einzige Problemumgehung, die ich fand, war, ein referenziertes Dokument anstelle eines eingebetteten Dokuments zu verwenden und dann einen zusammengesetzten Index für das referenzierte Dokument zu erstellen.
Offensichtlich ist eine Eindeutigkeitsprüfung nicht genug, da sie nicht vor den Rennbedingungen schützt. Ein anderes Problem, dem ich bei eindeutigen Indizes gegenüberstand, war, dass das Standardverhalten von Mongoid darin besteht, keine Fehler zu erzeugen, wenn die Validierung besteht und die Datenbank das Dokument nicht akzeptiert. Ich musste die folgende Konfigurationsoption in mongoid.yml ändern:
%Vor%Dies ist dokumentiert unter Ссылка
Nach der Änderung werden die Methoden zum Speichern / Erstellen einen Fehler auslösen, wenn die Datenbank das Speichern des Dokuments verweigert. Sie brauchen also etwas, um den Benutzern mitteilen zu können, was passiert ist:
%Vor%Auch das ist nicht wirklich eine gute Option, weil Sie raten müssen, welche Felder den Fehler verursacht haben (und warum). Eine bessere Lösung wäre es, in MongoidError nachzusehen und entsprechend eine entsprechende Fehlermeldung zu erzeugen. Das obige war für meine Bewerbung geeignet, also ging ich nicht so weit.
Fügen Sie eine Validierungsprüfung hinzu, indem Sie die Anzahl der IDs des Arrays von eingebetteten Tasks mit denen eines anderen Arrays mit eindeutigen IDs vergleichen.
%Vor%Arbeitete für mich.
Sie können eine validates_uniqueness_of in Ihrem Task-Modell definieren, um sicherzustellen, dass diese Validierung entsprechend der Mongoid-Dokumentation in Ссылка gilt in den Umfang des übergeordneten Dokuments und sollte tun, was Sie wollen.
Ihre Index-Technik sollte auch funktionieren, aber Sie müssen die Indizes generieren, bevor sie in Kraft treten. Mit Rails können Sie dies mit einer Rake-Aufgabe tun (in der aktuellen Version von Mongoid heißt sie db: mongoid: create_indexes). Beachten Sie, dass beim Speichern von Objekten, die gegen die Indexeinschränkung verstoßen, keine Fehler auftreten, da Mongoid (weitere Informationen finden Sie unter Ссылка ) ).
Tags und Links ruby-on-rails-3 mongoid ruby-on-rails mongodb