2015-11-17 20 views
1

我有下面的Ecto模型。当我渲染时,我希望JSON用属性名称“layers”替换“tilemap_layers”。Poison.Encoder如何重命名呈现的JSON中的属性?

我的应用程序中有很多'图层'类型,所以当我创建我的数据库模式时,我需要创建一个唯一命名的模式。但是,此JSON将由第三方客户端使用,必须将其命名为“图层”。

这样做的建议方法是什么?

该模型是在这里:

defmodule MyProject.Tilemap do 
    use MyProject.Web, :model 

    @derive {Poison.Encoder, only: [ 
    :name, 
    :tile_width, 
    :tile_height, 
    :width, 
    :height, 
    :orientation, 
    :tilemap_layers, 
    :tilesets 
    ]} 

    schema "tilemaps" do 

    field :name, :string 
    field :tile_width, :integer 
    field :tile_height, :integer 
    field :width, :integer 
    field :height, :integer 
    field :orientation, :string 

    has_many :tilemap_layers, MyProject.TilemapLayer 
    has_many :tilesets, MyProject.Tileset 

    timestamps 
    end 

    @required_fields ~w(tile_width tile_height width height) 
    @optional_fields ~w() 

    @doc """ 
    Creates a changeset based on the `model` and `params`. 

    If no params are provided, an invalid changeset is returned 
    with no validation performed. 
    """ 
    def changeset(model, params \\ :empty) do 
    model 
    |> cast(params, @required_fields, @optional_fields) 
    end 
end 

回答

3

毒不提供一种方式来别名使用@deriving

时,您可以:

自行指定执行与defimpl(从the docs拍摄) :

defimpl Poison.Encoder, for: Person do 
    def encode(%{name: name, age: age}, _options) do 
    Poison.Encoder.BitString.encode("#{name} (#{age})") 
    end 
end 

重命名字段中的模式:

has_many :layers, MyProject.TilemapLayer

或使用凤凰查看:

defmodule MyProject.TilemapView do 
    use MyProject.Web, :view 

    def render("index.json", %{tilemaps: timemaps}) do 
    render_many(tilemaps, __MODULE__, "tilemap.json") 
    end 

    def render("tilemap.json", %{tilemap: tilemap}) do 
    %{ 
     name: tilemap.name, 
     ... 
     layers: render_many(layers, MyProject.TilemapLayerView, "tilemap_layer.json") 
    } 
    end 
end 

然后创建一个TilemapLayerView:

+0

再次感谢Gazler!我正在尝试foreign_key选项,因为这是我真正想要的 –

+0

Woot!这工作!我确实需要改变一个小的错字。我改变了foreign_key :: tilemap_id –

+0

@JoshPetitt你可能不需要实际指定'foreign_key'。你可以试试吗? – Gazler