【问题标题】:Can't make work JSONB with Ecto model in Phoenix无法在凤凰城使用 Ecto 模型制作 JSONB
【发布时间】:2016-06-30 06:07:31
【问题描述】:

我一直在尝试将 JSON 保存在 postgresql 的 jsonb 列中,我已经尝试过 this 教程,并且还开始阅读 Ecto API 以及 Postgrex,但无法使其工作,一个可行的示例会启发我 :)到目前为止,我已将此添加到我的配置中

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

【问题讨论】:

    标签: elixir phoenix-framework jsonb ecto


    【解决方案1】:

    我不确定为什么它不适合你,但是:

    确保你有最新的 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
      

    【讨论】:

    • 谢谢,是的,它可以在没有任何改变的情况下工作,我一直在阅读一个旧的教程,过去它更复杂
    • 答案有效,但我试图嵌入一个关系和另一个字段以将其保留为地图,并且使用 json 更加困难,这样您可以检查我关于警告的新问题我得到stackoverflow.com/questions/36130420/…
    猜你喜欢
    • 2017-07-21
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    相关资源
    最近更新 更多