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.