I would like to generate JSON from an ecto association in phoenix.
this is my association:
defmodule Blog.Post do
use Ecto.Model
schema "posts" do
field :title, :string
field :body, :string
has_many :comments, Blog.Comment
end
end
and:
defmodule Blog.Comment do
use Ecto.Model
schema "comments" do
field :content, :string
belongs_to :post, Blog.Post
end
end
when I generate json without the association the result is this:
[%Blog.Post{body: "this is the very first post ever!", id: 1,title: "first post"},
%Blog.Post{body: "Hello nimrod!!!!", id: 12, title: "hi Nimrod"},
%Blog.Post{body: "editing the body!!!!", id: 6, title: "hello(edit)"}]
and the json looks like this
{"posts": [
{
"title": "first post",
"id": 1,
"body": "this is the very first post ever!"
},
{
"title": "hi Nimrod",
"id": 12,
"body": "Hello nimrod!!!!"
},
{
"title": "hello(edit)",
"id": 6,
"body": "editing the body!!!!"
}
]}
but with the association the outcome is this
[%Blog.Post{body: "this is the very first post ever!",
comments: {Ecto.Associations.HasMany.Proxy,
#Ecto.Associations.HasMany<[name: :comments, target: Blog.Post,
associated: Blog.Comment, references: :id, foreign_key: :post_id]>}, id: 1,
title: "first post"},
%Blog.Post{body: "Hello nimrod!!!!",
comments: {Ecto.Associations.HasMany.Proxy,
#Ecto.Associations.HasMany<[name: :comments, target: Blog.Post,
associated: Blog.Comment, references: :id, foreign_key: :post_id]>}, id: 12,
title: "hi Nimrod"},
%Blog.Post{body: "editing the body!!!!",
comments: {Ecto.Associations.HasMany.Proxy,
#Ecto.Associations.HasMany<[name: :comments, target: Blog.Post,
associated: Blog.Comment, references: :id, foreign_key: :post_id]>}, id: 6,
title: "hello(edit)"}]
With the above output I can't create a proper json output. I would like for the json to look something like this
{"posts": [
{
"title": "the title",
"id": 1,
"body": "the body",
"comments": [{"content": "a comment"}, {"content": "another comment"}]
}
...
]}
Any help would be appreciated.
Ouch, there is no easy solution at this moment. I would try something like:
defimpl Poison.Encoder, for: Tuple do
def encode(proxy, options) do
Poison.Encoder.List.to_json(proxy.all, options)
end
end
We are basically implementing encoder for tuples that receives the proxy above and encoding all items. We need to discuss better solutions for this.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With