Eu tenho o seguinte objeto que foi criado
@post = Post.create(:name => 'test', :post_number => 20, :active => true)
Depois que isso for salvo, quero poder recuperar o objeto para um hash, por exemplo, fazendo algo como:
@object.to_hash
Como isso é possível de dentro dos trilhos?
ruby-on-rails
ruby
Ben Morgan
fonte
fonte
.to_json
consultará o banco de dados se o modelo não estiver completojoins
eselect
,Person.joins(:address).select("addresses.street, persons.name").find_by_id(id).attributes
, vai voltar{ street: "", name: "" }
as_json
, ele chamará oserializable_hash
que, por sua vez, chamaráattributes
! Portanto, seu conselho é realmente adicionar duas camadas de complexidadeattributes
, tornando-a ainda mais cara..as_json
serializará o objeto para ruby hashNa versão mais recente do Rails (não é possível saber exatamente qual), você pode usar o
as_json
método:Saída:
Para ir um pouco mais longe, você pode substituir esse método para personalizar a aparência dos seus atributos, fazendo algo assim:
Em seguida, com a mesma instância acima, será exibida:
É claro que isso significa que você deve especificar explicitamente quais atributos devem aparecer.
Espero que isto ajude.
EDIT:
Além disso, você pode verificar a gema Hashifiable .
fonte
o as_json possui uma maneira muito flexível de configurar objetos complexos de acordo com as relações do modelo
EXEMPLO
A campanha modelo pertence à loja e tem uma lista
A lista de modelos possui muitas list_tasks e cada list_tasks possui muitos comentários
Podemos obter um json que combina todos esses dados facilmente.
Métodos de aviso :: tags podem ajudá-lo a anexar qualquer objeto adicional que não tenha relações com outras pessoas. Você só precisa definir um método com tags de nome na campanha modelo . Este método deve retornar o que você precisar (por exemplo, Tags.all)
Documentação oficial para as_json
fonte
to_
variante parece funcionar quase exatamente da mesma forma que aas_
variante, exceto pela saída citada. A única coisa que eu não gostei foi não preservar a ordem dos meus critérios de filtro. Parece estar em ordem alfabética. Eu pensei que isso estivesse relacionado à gema awesome_print que eu tenho no meu ambiente, mas não acho que seja esse o caso.Você pode obter os atributos de um objeto de modelo retornados como um hash usando
ou
as_json
permite incluir associações e seus atributos, bem como especificar quais atributos incluir / excluir (consulte a documentação ). No entanto, se você precisar apenas dos atributos do objeto base, o benchmarking no meu aplicativo com o ruby 2.2.3 e o rails 4.2.2 demonstra que issoattributes
requer menos da metade do tempoas_json
.fonte
Existem algumas ótimas sugestões aqui.
Eu acho que vale a pena notar que você pode tratar um modelo ActiveRecord como um hash assim:
Portanto, em vez de gerar um hash dos atributos, você pode usar o próprio objeto como um hash.
fonte
Você definitivamente poderia usar os atributos para retornar todos os atributos, mas poderia adicionar um método de instância ao Post, chamá-lo de "to_hash" e fazer com que ele retornasse os dados que você gostaria em um hash. Algo como
fonte
não tenho certeza se é isso que você precisa, mas tente isso no console ruby:
Obviamente, ele retornará um hash no console. se você deseja retornar um hash de dentro de um método - em vez de apenas "h", tente usar "return h.inspect", algo semelhante a:
fonte
Minha solução:
fonte
A resposta de Swanand é ótima.
se você estiver usando o FactoryGirl, poderá usar seu
build
método para gerar o hash do atributo sem a chaveid
. por exemplofonte
Pergunta antiga, mas muito referenciada ... Eu acho que a maioria das pessoas usa outros métodos, mas existe um
to_hash
método de fato, ele deve ser configurado corretamente. Geralmente, arrancar é uma resposta melhor após os trilhos 4 ... respondendo a isso principalmente porque eu tive que procurar um monte para encontrar esse tópico ou qualquer coisa útil e assumindo que outros estão enfrentando o mesmo problema ...Nota: não recomendamos isso para todos, mas para casos extremos!
Api do rubi nos trilhos ... http://api.rubyonrails.org/classes/ActiveRecord/Result.html ...
fonte