2017-04-10 2 views
1

私はUserというモデルを持っていて、すべてのユーザにUser.all.as_jsonを与えています。私はこのようになり、アレイ内の各ハッシュにカスタム値を追加したい値をRailsクエリにマージする方法as_json

[ 
    { 
     "username"=>"johndoe", 
     "first_name"=>"John", 
     "last_name"=>"Doe" 
    }, 
    { 
     "username"=>"test", 
     "first_name"=>"Test", 
     "last_name"=>"Number 1" 
    } 
    ] 

:私の結果は次のようになりますので、

Userモデルはまた、first_namelast_nameの値を持つ

[ 
    { 
     "username"=>"johndoe", 
     "first_name"=>"John", 
     "last_name"=>"Doe", 
     "full_name"=>"John Doe" 
    }, 
    { 
     "username"=>"test", 
     "first_name"=>"Test", 
     "last_name"=>"Number 1", 
     "full_name"=>"Test Number 1" 
    } 
    ] 

full_nameはモデルフィールドではなく、get_full_nameのメソッドです。私は各ハッシュでそのキー値をマージする方法を知らない。これは機能しませんでした:

posts = Post.all.as_json.each do |post| 
    post.merge({:full_name => post.get_full_name}) 
end 

full_name値のない元の結果を返します。

+2

あなたはあなたの例では代わりに、それぞれのマップを試してみましたか? –

+1

JSONにマージしてハッシュにマージしてから、JSONに変換しないでください。 「[ask]」とリンク先のページをお読みください。 SOはディスカッションリストではありません。文法とスペルはここでカウントされるので、 "&"は "and"の代わりではありません。 –

答えて

1

コードPost.all.as_jsonは、文字列キーを持つハッシュの配列を返します。したがって、ハッシュオブジェクトに対してget_full_nameメソッドを使用することはできません。

データをループ内のハッシュに変換し、変更を保存するにはeachの代わりにmapを使用する必要があります。

posts = Post.all.map do |post| 
    post.as_json.merge({:full_name => post.get_full_name}) 
end 

文字列キーとしてあなたfull_nameを取得するには、代わりのシンボルの、あなたのハッシュ内の文字列を使用することができます。

シリアライザは、あなたが望むそのように、あなたのデータをフォーマット別のクラスになるとから(次のようになります。これは単なる一回限りのものでない場合は、また、シリアライザを検討するかもしれない

post.as_json.merge({"full_name" => post.get_full_name}) 
+0

'post.attributes.merge(" full_name "=> post.get_full_name)'それ以上の改善はありますか?そして、jsonを 'posts.as_json'としましょう。 – Rigo

関連する問題