Rails geben das JSON-serialisierte Attribut with_indifferent_access zurück

Ich hatte vorher:

serialize :params, JSON

Dies würde jedoch den JSON-Code zurückgeben und Hash-Schlüsselsymbole in Zeichenfolgen konvertieren. Ich möchte den Hash mit Symbolen referenzieren, wie es bei der Arbeit mit Hashes am häufigsten vorkommt. Ich füttere es mit Symbolen, Rails gibt Strings zurück. Um dies zu vermeiden, habe ich meinen eigenen Getter / Setter erstellt. Der Setter ist einfach genug (JSON-Codierung), der Getter ist:

  def params
    read_attribute(:params) || JSON.parse(read_attribute(:params).to_json).with_indifferent_access
  end

Ich konnte mich nicht darauf beziehenparams direkt, weil das eine Schleife verursachen würde, also benutze ichread_attribute, und jetzt können meine Hash-Schlüssel mit Symbolen oder Zeichenfolgen referenziert werden. Der Hash wird dadurch jedoch nicht aktualisiert:

model.params.merge!(test: 'test')
puts model.params # => returns default params without merge

Was mich denken lässt, dass der Hash durch Kopie referenziert wird.

Meine Frage ist zweifach. Kann ich die JSON-Serialisierung für aktive Datensätze erweitern, um einen gleichgültigen Zugriffs-Hash zurückzugeben (oder Symbole nicht in Zeichenfolgen umzuwandeln), und die oben beschriebene Hash-Funktion beim Zusammenführen beibehalten? Wenn nicht, was kann ich tun, um meinen Getter so zu verbessern?model.params.merge! funktioniert?

Ich habe auf etwas in der Art gehofft (was funktioniert):

  def params_merge!(hash)
    write_attribute(:params, read_attribute(:params).merge(hash))
  end

  # usage: model.params_merge!(test: 'test')

Besser noch, lassen Sie Rails einfach einen Hash mit gleichgültigem Zugriff zurückgeben oder konvertieren Sie meine Symbole nicht in Strings! Schätzen Sie jede Hilfe.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage