/ / Comment puis-je construire cet objet JSON en ruby? - rubis sur rails, rubis, json

Comment construire cet objet JSON en ruby? - rubis sur rails, rubis, json

Je dois apporter un tableau d'objets ruby ​​en JSON. J'aurai besoin de trouver l'élément dans l'objet JSON par identifiant. Je pense donc qu'il est préférable que l'identifiant soit la clé de chaque objet. Cette structure a le plus de sens pour moi:

{
"1":   {"attr1": "val1", "attr2": "val2"},
"2":   {"attr1": "val1", "attr2": "val2"},
"3":   {"attr1": "val1", "attr2": "val2"}
}

De cette façon, je peux facilement appeler l'objet json comme console.log(json_obj[id].attr1)

Le problème est que je ne sais pas trop comment construire cela en rubis. C'est pour autant que j'ai eu:

# in ruby
@book_types = []
BookType.all.each do |bt|
@book_types << {bt.id => {:attr => bt.attr}}
end
@book_types = @book_types.to_json

// In JS
var bookTypes = JSON.parse("<%=raw @book_types %>");

2 questions: Comment puis-je construire cela en rubis? Y a-t-il une meilleure façon d'accomplir ce que je fais?

Aussi juste une note que je construis cela sur le cadre de Rails

Merci!

Réponses:

10 pour la réponse № 1

En supposant que BookType soit une classe ActiveRecord, vous pouvez simplement faire ceci:

BookType.all(:select => "attr1, attr2").to_json

...où "attr1, attr2" est une liste des attributs que vous souhaitez inclure dans votre JSON.

Si tu veux le ids comme touches, vous pouvez le faire à la place:

BookType.all.inject({}) { |hsh, bt|
hsh[bt.id] = { "attr1" => bt.attr1, "attr2" => bt.attr2 }
hsh
}.to_json