2009-12-24 4 views
2

J'ai un objet dans Ruby appelé Post. Je voudrais convertir un message en json mais je veux aussi inclure le nom de l'utilisateur qui a posté le message. La chose est nom_utilisateur n'est pas présent dans l'objet Post, mais l'ID utilisateur est.To_Json overriding dans Ruby

donc ce que je veux effectivement est quelque chose comme ça

{name:"My Post", body:"My post data", user_name:"jhonny"} 

Quand je fais un to_json sur l'objet après je me suit

{name:"My Post", body:"My post data"} 

Mais je veux aussi ajouter user_name:"jhonny" partie aussi à elle. Je sais que je peux faire un hachage et ensuite faire un to_json sur le hachage, mais je ne veux pas faire le hachage pour toutes les valeurs de poste manuellement car il y a beaucoup d'attributs à publier. Je préfère utiliser une fonction de fusion de hash pour ajouter l'attribut supplémentaire à hash, puis appeler json sur celui-ci.

Existe-t-il un moyen de créer un objet de hachage rapide pour une classe ruby? Toutes les idées seront les bienvenues.

Quelque chose comme

my_post.hash.merge{:user_name => "jhonny"}.to_json 

Vive.

+0

Je l'ai trouvé un moyen comme ActiveRecord :: JSON.decode (my_post.to_json) .merge ({: user_name => "Jhonny"}). To_json Cela fonctionne mais c'est un mauvais hack. Je veux un moyen plus propre de bien faire les choses. – Priyank

+0

Je ne pense pas que ce soit un mauvais hack. Vous ne modifiez que post en json, puis revenez à un hachage, puis fusionnez le nom d'utilisateur, puis convertissez le hachage entier en json. Il aurait été un mauvais hack si elle a échoué dans un scénario. – Waseem

Répondre

4

répondre à votre question devrait être quelque chose comme ça

my_post.attributes.merge{:user_name => "jhonny"}.to_json 

Quoi qu'il en soit, si cela ne fonctionne pas, essayez l'une des solutions suivantes:

Ajoutez ceci à votre modèle Post:

def to_json 
    ActiveRecord::JSON.decode(super).merge({:user_name => user.user_name}).to_json 
end 

Une autre solution ajoutera user_name méthode au modèle Post:

def user_name 
    user.user_name 
end 

Ensuite, utilisez to_json comme suit:

my_post.to_json(:methods => :username) 
+0

première suggestion fonctionne bien et semble bien aussi. Merci – Priyank

0

Si votre modèle Post est le modèle ActiveRecord, il accepte: sauf: inclure et: seuls paramètres pour les méthodes de sérialisation, #to_json inclus. Voir les détails et exemples here in the AR documentation.

Fondamentalement, vous aurez besoin de quelque chose comme

my_post.to_json(:include => { :user => { :only => :user_name } })