Rails retorna o atributo serializado JSON with_indifferent_access
Eu já tive:
serialize :params, JSON
Mas isso retornaria o JSON e converteria símbolos de chave de hash em cadeias de caracteres. Eu quero referenciar o hash usando símbolos, como é mais comum quando se trabalha com hashes. Eu alimentei símbolos, Rails retorna strings. Para evitar isso, criei meu próprio getter / setter. O setter é simples o suficiente (codificação JSON), o getter é:
def params
read_attribute(:params) || JSON.parse(read_attribute(:params).to_json).with_indifferent_access
end
Não consegui referenciarparams
diretamente porque isso causaria um loop, então estou usandoread_attribute
e agora minhas chaves hash podem ser referenciadas com símbolos ou strings. No entanto, isso não atualiza o hash:
model.params.merge!(test: 'test')
puts model.params # => returns default params without merge
O que me faz pensar que o hash está sendo referenciado por cópia.
Minha pergunta é dupla. Posso estender a serialização JSON do registro ativo para retornar hash de acesso indiferente (ou não converter símbolos em sequências de caracteres) e ainda ter o trabalho de hash acima com mesclagem? Se não, o que posso fazer para melhorar meu getter para quemodel.params.merge!
trabalho?
Eu estava esperando por algo ao longo das linhas de (que funciona):
def params_merge!(hash)
write_attribute(:params, read_attribute(:params).merge(hash))
end
# usage: model.params_merge!(test: 'test')
Melhor ainda, é só pegar o Rails para retornar um hash com acesso indiferente ou não converter meus símbolos em strings! Aprecie qualquer ajuda.