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?
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%Hier ist eine ähnliche Lösung für Rails 3.1.3.
Von: Ссылка
Fügen Sie den folgenden Code in config / initializers /
ein %Vor% 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 #{column}_raw
umbenannt und dann den folgenden Code im Modell verwendet (für das Attribut media
in meinem Fall).
Nun funktionieren Teilupdates für mich großartig, und das Feld wird nur aktualisiert, wenn die Daten tatsächlich geändert werden.
Das Problem mit Joris 'Antwort ist, dass es sich in die alias_method_chain
-Kette einklinkt und alle nachfolgenden Ketten deaktiviert (wie update_with_callbacks
, 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 update_without_foo
auf update_with_bar
und update_without_bar
auf update_with_baz
Da Sie update_with_bar
nicht direkt an den inneren Funktionen von alias_method_chain
ändern können, versuchen Sie, sich in die Kette einzuklinken, indem Sie einen neuen Link (bar2) hinzufügen und update_without_bar aufrufen, also:
Leider erhalten Sie die folgende Kette:
%Vor%Also update_with_foo ist weg!
Wenn Sie wissen, dass alias_method_chain
es Ihnen nicht erlaubt, _with
methods neu zu definieren, war meine Lösung bisher, update_without_dirty
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.
Tags und Links ruby-on-rails-3 ruby-on-rails serialization update-attributes