2012-04-10 16 views
0

Ich bin ein seltsames Verhalten in Mongoid sehen 2.3.4Mongoid - Array Zuordnung

class Student 
    has_and_belongs_to_many: teachers 
end 

class Teacher 
    has_and_belongs_to_many: students 
end 

Jetzt in IRB

s = Student.first 
s.teachers 
=> [] 

s.teacher_ids = [Teacher.first.id, Teacher.last.id] 
s.teacher_ids 
=> [[BSON::ObjectId4f7c3300913417162c000008, BSON::ObjectId4f7c333b913417162c00000d]] 

nicht sicher, warum diese Anordnung so verschachtelt ist. Ich erwartete

[BSON::ObjectId4f7c3300913417162c000008, BSON::ObjectId4f7c333b913417162c00000d] 

Dies bricht Multi Auswahlfelder in Rails, wo die Massenzuordnungen von ids würde wie in IRB gezeigt passieren.

+0

Warum aktualisieren Sie nicht auf eine neuere Version von Mongoid? – rubish

+0

Ok, ich überprüfe, ob dieses Verhalten in neueren Versionen korrigiert wird. Siehst du es in einer neueren Version richtig funktioniert? –

+0

Ich habe viele solche Felder in meinen Ansichten und sie funktionieren perfekt für mich. Ich hatte es in 2.2.2 und auch nach dem Wechsel zu 2.4.6 – rubish

Antwort

2

Es hat möglicherweise damit zu tun, dass Sie versuchen, das teachers_ids-Attribut auf ein Array von Teacher-Objekten zu setzen.

Sie könnten diese als Alternativen versuchen:

s.teachers = [Teacher.first, Teacher.last] 

oder

s.teachers << Teacher.first 
s.teachers << Teacher.last 

Update:

Ich habe gerade einen kleinen Test laufen und kann bestätigen, dass Ihre Methode der Zuordnung funktioniert gut in Mongoid 2.4.6 (das ist genau das, was ich installiert habe) und 2.4.8.

Wenn Sie aus irgendeinem Grund nicht zu Mongoid 2.4 aktualisieren, können Sie auch die IDs vorbei in als String Objekte statt als ObjectId versuchen könnte, das ist, wie es behandelt werden würde, wenn diese in durch Parameter POST übergeben wurde.

s.teacher_ids = [Teacher.first.id.to_s, Teacher.last.id.to_s] 
+0

funktioniert Diese Verwendung funktioniert. Meine Verwendung simuliert die Art und Weise, wie Rails mit den POST-Parametern umgehen würde - massen Sie das Array von IDs. Wenn zum Beispiel der Lehrer aus einer Mehrfachauswahlliste ausgewählt wird, hätten die Postenparameter eine Liste von Lehreridentifikationen, wie [1,2,3], die dann dem Schüler massenweise zugewiesen werden würden, d. student.teacher_ids = [1,2,3] –

+0

Ich habe meine Antwort aktualisiert, es scheint, als ob die verschiedenen Zuweisungsmethoden in Mongoid 2.4.x gut funktionieren – theTRON