ActiveRecord scheint nicht zu verstehen, dass bei einer Menge von Parametern für einen vorhandenen Datensatz mit verschachtelten Attributen ein neuer verschachtelter Datensatz erstellt werden kann, der selbst einen verschachtelten vorhandenen Datensatz enthält. (Beziehungsbaum: Existing -> New -> Existing
)
Ist das ein Fehler, oder fehle ich etwas?
Lassen Sie mich Ihnen ein einfaches Beispiel zeigen.
Hier sind meine Modelle:
%Vor% Ich habe in jeder Tabelle einen Datensatz erstellt und sie entsprechend verknüpft, so dass jede Tabelle einen Datensatz mit einem id=1
enthält - das ist bekannt. Nun, wenn ich einen bestehenden Benutzer, einen neuen Post und eine existierende Gruppe habe und versuche, diesen mit accepts_nested_attributes_for
zu aktualisieren, mag es das nicht:
Es denkt, dass es keine Gruppe (mit einer bekannten ID) finden kann, die sich auf eine neue Post bezieht.
Es funktioniert, wenn ich die ID aus dem group_attributes
entferne (aber es erstellt einen neuen Gruppendatensatz).
Es funktioniert, wenn ich dem posts_attributes
eine ID gebe und die ID aus dem group_attributes
entferne (und wieder eine neue Gruppe erstelle).
Es funktioniert auch, wenn sie alle IDs haben.
Die Beziehung funktioniert:
%Vor% Es funktioniert auch vollständig, wenn posts_attributes
und group_attributes
während der Erstellung von User
verwendet werden, wenn alle Datensätze neu sind.
Sollte es im ersten Beispiel noch nicht funktionieren? ActiveRecord sollte schlau genug sein, das herauszufinden ...!
Folgendes passiert, was ich denke: Sie geben eine ID für eine Gruppe ein und geben ActiveRecord an, dass die Gruppe existiert. ActiveRecord versucht, diese Gruppe zu finden, um sie mit den anderen Daten in group_attributes zu aktualisieren. Da Sie dies innerhalb der post_attributes ausführen, versucht ActiveRecord, diese Gruppe über die Verknüpfung zwischen dem Beitrag zu finden und die Gruppe . Das heißt, ActiveRecord sucht zuerst nach der zugehörigen Gruppe - wobei id = post.group_id - und sucht dann nach dem mit ID = 1. Das mag für eine Elternbeziehung etwas komisch und unbeholfen wirken, wie in Ihrem Fall, aber Ich bin mir sicher, dass Sie sehen können, dass dies ein nützliches Verhalten ist, wenn Sie in die andere Richtung gehen, wo die verschachtelten Attribute eines oder mehrere von möglicherweise vielen Kindern repräsentieren.
Ihr post-Objekt, das aus den Daten in post_attributes erstellt wurde, ist jedoch noch keiner Gruppe zugeordnet - post.group_id ist null. Wenn ActiveRecord die erste Suche ausführt, um die zugehörige Gruppe zu erhalten, wird sie leer angezeigt. Dementsprechend findet es in den (leeren) Ergebnissen keine Gruppe mit ID = 1. Technisch ist der Datensatz da, aber es ist nicht in Bezug auf die Verbindung mit dem Post .
Sie können dies beweisen, indem Sie group_id = & gt; 1 in post_attributes. Ich glaube, wenn Sie das tun, wird ActiveRecord die Gruppe durch die Assoziation finden, dann die Gruppe mit ID = 1 aus den Ergebnissen subselektieren, und dann diese Gruppe mit den zusätzlichen Daten in group_attributes aktualisieren.
Beachten Sie außerdem, dass der einzige Grund , die verschachtelten Attribute für die Gruppe innerhalb des Posts wie folgt einzuschließen, ist, wenn Sie dem Benutzer erlauben, den Gruppennamen gleichzeitig mit der Erstellung zu aktualisieren ein neuer Beitrag Wenn Sie nur den neuen Post mit der bestehenden Gruppe verknüpfen möchten, müssen Sie nur group_id in post_attributes einschließen und Sie können group_attributes loswerden.
Tags und Links ruby-on-rails activerecord nested-attributes