Rails возвращает сериализованный атрибут JSON with_indifferent_access

У меня ранее было:

serialize :params, JSON

Но это вернет JSON и преобразует символы хеш-ключа в строки. Я хочу ссылаться на хеш, используя символы, как это чаще всего случается при работе с хешами. Я передаю ему символы, Rails возвращает строки. Чтобы избежать этого, я создал свой собственный метод получения / установки. Установщик достаточно прост (кодировка JSON), получатель:

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

Я не могт ссылкаparams непосредственно, потому что это вызовет цикл, поэтому ям используюread_attribute, и теперь на мои ключи хеша можно ссылаться с помощью символов или строк. Тем не менее, это не обновляет хэш:

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

Что заставляет меня думать, что на хеш ссылается копия.

Мой вопрос двоякий. Могу ли я расширить сериализацию активной записи JSON, чтобы возвращать хэш индифферентного доступа (или не преобразовывать символы в строки), и при этом выполнять слияние с помощью слияния, как описано выше? Если нет, что я могу сделать, чтобы улучшить свой геттер так, чтобыmodel.params.merge! работает?

Я надеялся на что-то вроде (что работает):

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

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

А еще лучше, просто заставить Rails возвращать хэш с равнодушным доступом или не конвертировать мои символы в строки! Ценю любую помощь. ?

Ответы на вопрос(4)

Ваш ответ на вопрос