Custom_fields aktualisiert: Gleichzeitige Ursache, Wert wird zu Array.

Dieser Bug scheint in diesem Beitrag vor einiger Zeit behoben worden zu sein: Custom_fields simultaneous save with json becomes an array

Leider habe ich nun mit gleichzeitigen Endpunkten zu tun, die die benutzerdefinierten Felder (custom_fields) eines Nutzers gleichzeitig aktualisieren, wodurch die von mir als :text gesetzten Werte zu Arrays werden.

3 Endpunkte werden aufgerufen und setzen custom_field auf ein Array anstelle eines Strings

Hilfe wäre willkommen! Dies blockiert derzeit mein gesamtes Projekt.

Ich stoße auf dieses Problem in Version 2.5.0.beta7 in der lokalen Entwicklung.

Gibt es eine Möglichkeit, in diesem Fall eine Sperre auf der Datenbank zu setzen, bis die Werte gespeichert sind?

1 „Gefällt mir“

Könnte dies das Problem sein, das ich habe? Differences between transactions and locking - makandra dev

Beachten Sie, dass, wenn zwei Transaktionen gleichzeitig in zwei Threads ausgeführt werden, jeder Thread die Änderungen der anderen Transaktion nicht sieht, bis sie erfolgreich commitet wurden. Er sieht jedoch seine eigenen Änderungen (dies ist eine vereinfachte Erklärung; die Realität ist viel komplexer).

1 „Gefällt mir“

def self.cast_custom_field(key, value, types, return_array = true)

Zeigt normale Werte an, was mich dazu veranlasst zu denken, dass mehrere Zeilen erstellt wurden.

2 „Gefällt mir“

Das sollte es behoben haben. Es war ein langjähriges Problem.

2 „Gefällt mir“

Ja, ich habe es gesehen :frowning:

Leider muss ich jetzt möglicherweise gleichzeitig sensible Daten aktualisieren. Ich denke, das liegt daran, dass ich dies über Endpunkte tue, aber das ist die einzige Möglichkeit, die ich habe, und ich habe keine Kontrolle über die Aufrufe. Es kann ein Aufruf sein, es können auch 10 sein.

Ich kann versuchen, die Aufrufe von der App aus zu minimieren und einige Daten gebündelt zu senden. Das Problem ist jedoch, dass es zwei Quellen für die Aufrufe gibt: Mobilgeräte und externe Dienste.

Es sind Zahlungsdaten im Spiel :frowning:

1 „Gefällt mir“

Das klingt nach dem bestehenden Verhalten von benutzerdefinierten Feldern und nicht nach einer Regression. Es gibt mehrere Möglichkeiten, dies zu beheben:

  1. Sie können einen eindeutigen Index für das benutzerdefinierte Feld (name, user_id) hinzufügen.
  2. Sie können Ihren Code mit einem DistributedMutex umgeben.
  3. Sie können ein Tabellendesign anstelle von benutzerdefinierten Feldern verwenden.
3 „Gefällt mir“

So ähnlich? Scheint zu funktionieren.

DistributedMutex.synchronize("user_data_update_#{user.id}") do
    user.save_custom_fields(true)
end
1 „Gefällt mir“

Darüber hinaus werde ich die Logik so ändern, dass die Aufrufe nacheinander und nicht alle gleichzeitig ausgeführt werden, was hoffentlich Probleme vermeidet.

Danke, Leute @eviltrout @fzngagan

4 „Gefällt mir“