Ich bin heute auf dieses Problem gestoßen und habe schließlich meinen eigenen Serializer zusammen mit einem Getter und Setter gehackt. Zuerst habe ich das Feld in %code% umbenannt und dann den folgenden Code im Modell verwendet (für das Attribut %code% in meinem Fall).
%Vor%Nun funktionieren Teilupdates für mich großartig, und das Feld wird nur aktualisiert, wenn die Daten tatsächlich geändert werden.
Dies ist wahrscheinlich eines der Dinge, die alle neuen Benutzer früher oder später über Rails erfahren. Ich habe gerade festgestellt, dass rails alle Felder mit dem Schlüsselwort serialize aktualisiert, ohne zu überprüfen, ob sich wirklich etwas im Inneren geändert hat. In einer Weise, die für den generischen Rahmen sinnvoll ist.
Aber gibt es eine Möglichkeit, dieses Verhalten zu überschreiben? Wenn ich verfolgen kann, ob sich die Werte in einem serialisierten Feld geändert haben oder nicht, gibt es eine Möglichkeit, zu verhindern, dass es in der Update-Anweisung verschoben wird? Ich habe versucht, "update_attributes" zu verwenden und den Hash auf die Interessenfelder zu beschränken, aber rails aktualisiert weiterhin alle serialisierten Felder.
Vorschläge?
Hier ist eine ähnliche Lösung für Rails 3.1.3.
Von: Ссылка
Fügen Sie den folgenden Code in config / initializers /
ein %Vor%Ja, das nervte mich auch. Dies habe ich für Rails 2.3.14 (oder niedriger) getan:
%Vor%Dann verwenden Sie in Ihrem Controller:
%Vor%Oder definieren Sie es in Ihrem Modell, wenn Sie nach der Erstellung keine Änderungen am serialisierten Feld erwarten (aber update_attribute (: serialized_field = & gt; "update me" funktioniert immer noch!)
%Vor%Das Problem mit Joris 'Antwort ist, dass es sich in die %code% -Kette einklinkt und alle nachfolgenden Ketten deaktiviert (wie %code% , was für die Probleme verantwortlich ist, dass Trigger nicht aufgerufen werden). Ich werde versuchen, ein Diagramm zu machen, um es leichter zu verstehen.
Sie können mit einer solchen Kette beginnen
%Vor%Beachten Sie, dass %code% auf %code% und %code% auf %code%
zeigtDa Sie %code% nicht direkt an den inneren Funktionen von %code% ändern können, versuchen Sie, sich in die Kette einzuklinken, indem Sie einen neuen Link (bar2) hinzufügen und update_without_bar aufrufen, also:
%Vor%Leider erhalten Sie die folgende Kette:
%Vor%Also update_with_foo ist weg!
Wenn Sie wissen, dass %code% es Ihnen nicht erlaubt, %code% methods neu zu definieren, war meine Lösung bisher, %code% neu zu definieren und die Attributauswahl dort vorzunehmen.
Nicht ganz eine Lösung, aber in vielen Fällen war es für mich eine gute Lösung, einfach die serialisierten Spalten in ein zugehöriges Modell zu verschieben - oft passte das eigentlich schon semantisch dazu.
Es gibt auch Diskussionen in Ссылка .