Gibt es eine Möglichkeit zu verhindern, dass serialisierte Attribute in Rails aktualisiert werden, auch wenn es keine Änderungen gibt?

8

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?

    
Tabrez 05.01.2012, 15:39
quelle

6 Antworten

1

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%     
Joris 24.01.2012, 11:57
quelle
2

Hier ist eine ähnliche Lösung für Rails 3.1.3.

Von: Ссылка

Fügen Sie den folgenden Code in config / initializers /

ein %Vor%     
Sibevin Wang 18.05.2012 04:05
quelle
1

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).

%Vor%

Nun funktionieren Teilupdates für mich großartig, und das Feld wird nur aktualisiert, wenn die Daten tatsächlich geändert werden.

    
johnrees 22.10.2012 17:03
quelle
1

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

zeigt

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:

%Vor%

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.

    
diegogs 07.12.2012 21:22
quelle
1

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.

    
M.G.Palmer 26.05.2015 14:05
quelle
0

Es gibt auch Diskussionen in Ссылка .

    
woto 17.10.2013 05:13
quelle