Я ранее имел:
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-сериализации, чтобы возвращать безразличный хэш доступа (или не преобразовывать символы в строки), и все еще иметь работу hash, как указано выше, слиянием? Если нет, что я могу сделать, чтобы улучшить мой геттер, чтобы model.params.merge!
работал?
Я надеялся на что-то похожее (что работает):
def params_merge!(hash)
write_attribute(:params, read_attribute(:params).merge(hash))
end
# usage: model.params_merge!(test: 'test')
Еще лучше, просто запустите Rails, чтобы вернуть хэш с равнодушным доступом или не преобразовать мои символы в строки! Цените любую помощь.