2012-04-01 15 views
1

Derzeit habe ich eine address Spalte, die ein eingebettetes Dokument in meiner users Tabelle ist. Die Spalte address enthält die _id für verwandte Zeilen in der Tabelle address. Jeder user kann viele addresses haben, so dass es mehrere eingebettete Dokumente in der Spalte useraddress geben kann, wenn dieser Benutzer mehr als eine Adresse hat.Wie aktualisieren Sie alle eingebetteten Dokumente für eine bestimmte Spalte in einer Tabelle in Mongoid?

Wie lösche ich alle address eingebetteten Dokumente für eine bestimmte Adresse id? In meinem Fall, wenn ein Benutzer eine Adresse löscht, möchte ich diese spezifische Adresse aus ALL der eingebetteten Dokumente address in der Tabelle users löschen.

Ist dies in der Schienenkonsole möglich?

Dank

Antwort

1

Sie tun können:

User.where('addresses.id' => address.id).each do |u| 
    u.addresses.where(:id => address.id).delete 
    u.save 
end 
+0

Dies funktioniert nicht. Es findet es nicht, also kehrt es nicht zurück. Ich habe sogar 'User.where ('addresss.id' => address.id) .first' ausprobiert und es kommt nil zurück. – Goalie

+0

Wie erhalten Sie die Adresse von Ihrem Benutzer? – shingara

0

Sie können auch tun:

while User.where('addresses._id' => address.id).count > 0 
    User.collection.update({'addresses._id' => address.id}, 
     {'$pull' => { :addresses => { '_id' => address.id } } }, 
     :multi => true) 
end 

Dadurch werden alle Rückrufe nicht ausgeführt werden. Wenn Sie Callbacks benötigen, sollten Sie die Methode von Shingara verwenden, aber ersetzen Sie delete durch destroy

+0

Das macht nichts. Ich habe sogar 'User.where ('addresses._id' => address.id)' versucht und es gibt nil zurück. Es sieht so aus, als würde man die eingebetteten Dokumente nicht sehen. – Goalie

+0

@Goalie Wenn Sie keine benutzerdefinierte ID für Adressen festlegen und mongo die ID setzen, dann hat keines der Dokumente die gleiche ID (selbst eingebettete). Es muss einen anderen Weg für Sie geben, um festzustellen, ob zwei Adressen gleich sind oder nicht. Sie sollten das anstelle von "addresss._id" => address.id' verwenden – rubish

Verwandte Themen