2017-04-10 47 views
1

我有一個名爲User的模型,我得到所有用戶User.all.as_json如何將值合併到Rails查詢中as_json

User模型也有first_namelast_name值,所以我的結果會是這個樣子:

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

我想自定義值添加到看起來像這樣的陣列中的每個哈希:

[ 
    { 
     "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。請閱讀「[問]」和鏈接的頁面。請注意,SO不是討論列表。語法和拼寫確實在這裏算,所以「&」不能代替「和」。 –

回答

1

代碼Post.all.as_json返回散列數組和字符串鍵。所以你不能在散列對象上使用方法get_full_name。

您應該將數據轉換爲循環中的散列,並使用map而不是each來保留您的更改。

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

1

你也可以考慮串行,如果這不只是一次性的事情:

串行器將是一個單獨的類,用於格式化你的數據,你想要的方式看起來是這樣的(從由Ryan貝茨railscasts):

class PostSerializer < ActiveModel::Serializer 

    def full_name 
    end 
end 

http://railscasts.com/episodes/409-active-model-serializers

相關問題