2016-03-15 78 views
4

我一直试图在postgresql的jsonb列中保存JSON,我试过this教程,并开始阅读Ecto API以及Postgrex,但无法使其工作,工作的例子就是光线我:)到目前为止,我已经加入这个我的配置无法在Phoenix中使用Ecto模型生成JSONB

config :bonsai, Bonsai.Repo, 
    adapter: Ecto.Adapters.Postgres, 
    username: "demo", 
    password: "demo123", 
    database: "bonsai_test", 
    hostname: "localhost", 
    pool: Ecto.Adapters.SQL.Sandbox, 
    extensions: [{Postgrex.Extensions.JSON, [library: Poison]}] 

这是我的模型

defmodule Bonsai.Organization do 
    use Bonsai.Web, :model 

    schema "organizations" do 
    field :name, :string 
    field :currency, :string 
    field :tenant, :string 
    field :info, Bonsai.Json.Type, default: %{} 
    field :settings, :map, default: %{} #, :map#, Bonsai.Json.Type 

    timestamps 
    end 

    @required_fields ~w(name currency tenant) 
    @optional_fields ~w() 

    def changeset(model, params \\ :empty) do 
    model 
    |> cast(params, @required_fields, @optional_fields) 
    end 
end 

和类型的定义是web/utils/json.ex

defmodule Bonsai.Json.Type do 
    @behaviour Ecto.Type 
    alias Bonsai.Json 

    def type, do: :json 

    def load({:ok, json}), do: {:ok, json} 
    def load(value), do: load(Poison.decode(value)) 

    def dump(value), do: Poison.encode(value) 
end 

当我尝试测试我无法保存信息或设置地图

defmodule Bonsai.OrganizationTest do 
    use Bonsai.ModelCase 

    alias Bonsai.Organization 

    @valid_attrs %{currency: "USD", name: "Home", tenant: "bonsai", 
    settings: %{"last_save" => true}, 
    info: %{"address" => "Samaipata", "mobile" => "73732677", "age" => 40} 
    } 
    test "Store json data" do 
    changeset = Organization.changeset(%Organization{}, @valid_attrs) 
    {:ok, org} = Bonsai.Repo.insert(changeset) 
    assert @valid_attrs.info() == org.info 
    end 
end 

回答

6

我可不是RLY知​​道为什么它不是为你工作,但是:

确保你有最新的postgresql版本,json支持有点新。

这是为我工作,也许会有所帮助。

  • 迁移文件

    def change do 
    create table(:objects) do 
    add :drawing, :jsonb 
    timestamps 
    end 
    
  • 我使用JSON场为好,但在我的模型的映射:

    use .Web, :model 
        schema "objects" do 
        field :drawing, :map 
        timestamps 
        end 
    
+0

由于是的,它工作没有任何改变路上,我一直在读一个古老的tutotial,这是在过去 –

+0

答案工程比较复杂,但我试图嵌入一个关系而另一场刚刚离开它作为一个地图,它更难以与JSON这样你可以检查我的新问题有关的警告,我得到http://stackoverflow.com/questions/36130420/ecto-warning-with工作 - 嵌入式模型 –