Eu tenho uma condição em que, recebo um hash
hash = {"_id"=>"4de7140772f8be03da000018", .....}
e eu quero esse hash como
hash = {"id"=>"4de7140772f8be03da000018", ......}
PS : Não sei quais são as chaves no hash, elas são aleatórias, que vêm com um prefixo "_" para cada chave e não quero sublinhados
ruby-on-rails
ruby
ruby-on-rails-3
hash
Manish Das
fonte
fonte
_id
chaves paraid
em uma variedade de documentos MongoDBRespostas:
fonte
hash.delete :old_key
retorna e a exclusão usa a chave antiga. WOW, eu quero isso tatuado Graças algum lugar :-Dtrilhos O Hash possui um método padrão:
http://api.rubyonrails.org/classes/Hash.html#method-i-transform_keys
UPD: método ruby 2.5
fonte
Se todas as chaves forem cadeias de caracteres e todas elas tiverem o prefixo de sublinhado, você poderá corrigir o hash no lugar com isso:
O
k[1, k.length - 1]
bit agarra todos,k
exceto o primeiro caractere. Se você deseja uma cópia, então:Ou
Você também pode usar
sub
se não gostar dak[]
notação para extrair uma substring:E, se apenas algumas das chaves tiverem o prefixo de sublinhado:
Modificações semelhantes podem ser feitas em todas as outras variantes acima, mas estas duas:
deve estar bem com chaves que não tenham prefixos de sublinhado sem modificações extras.
fonte
você pode fazer
Isso deve funcionar para o seu caso!
fonte
Se quisermos renomear uma chave específica no hash, podemos fazer o seguinte:
Suponha que meu hash seja
my_hash = {'test' => 'ruby hash demo'}
Agora, quero substituir 'test' por 'message';
my_hash['message'] = my_hash.delete('test')
fonte
hash[:new_key] = has[:old_key]
, não é:, em vez disso éhash[:dynamic_key] = hash[:_dynamic_key]
:, era uma pergunta clara sobre regex e não simples substituição de hash.fonte
fonte
Eu fui exagero e criei o seguinte. Minha motivação por trás disso foi anexar chaves de hash para evitar conflitos de escopo ao mesclar / achatar hashes.
Exemplos
Estender classe hash
Adiciona o método rekey às instâncias Hash.
Anexar Exemplo
Exemplo de acabamento
Achatando e anexando um "escopo"
Se você passar um hash de volta para re-codificar, ele mesclará o hash, o que permite nivelar as coleções. Isso nos permite adicionar escopo às nossas chaves ao nivelar um hash para evitar a substituição de uma chave na mesclagem.
fonte
As respostas anteriores são boas o suficiente, mas podem atualizar os dados originais. Caso você não queira que os dados originais sejam afetados, tente meu código.
Primeiro ele ignora a chave '_id' e depois se funde com a chave atualizada.
fonte