2016-03-15 79 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工作 - 嵌入式模型 –