Railsy zwracają atrybut JSON serializowany z_dostępem_indifferent

Poprzednio miałem:

serialize :params, JSON

Ale to zwróci JSON i przekonwertuje symbole klucza skrótu na łańcuchy. Chcę odwoływać się do skrótu za pomocą symboli, co jest najbardziej powszechne podczas pracy z hashami. Karmię go symbolami, Railsy zwracają ciągi. Aby tego uniknąć, stworzyłem swój własny getter / setter. Setter jest dość prosty (kodowanie JSON), getter to:

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

Nie mogłem się odwołaćparams bezpośrednio, ponieważ spowodowałoby to pętlę, więc używamread_attribute, a teraz moje klawisze skrótu można odwoływać się za pomocą symboli lub łańcuchów. Nie powoduje to jednak aktualizacji skrótu:

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

Co sprawia, że ​​myślę, że skrót jest przywoływany przez kopię.

Moje pytanie jest dwojakie. Czy mogę rozszerzyć aktywną serializację rekordów JSON, aby zwrócić mieszanie z obojętnym dostępem (lub nie konwertować symboli na łańcuchy), a mimo to połączyć pracę mieszania z powyższym połączeniem? Jeśli nie, co mogę zrobić, aby poprawić mój gettermodel.params.merge! Prace?

Liczyłem na coś podobnego do (który działa):

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

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

Jeszcze lepiej, po prostu daj Railsom zwrot hash z obojętnym dostępem lub nie konwertuj moich symboli na łańcuchy! Doceń każdą pomoc.

questionAnswers(4)

yourAnswerToTheQuestion