带有嵌入式模型的 ECTO 警告



我在投射时收到此警告

警告:使用 cast/4 的强制转换嵌入已弃用,请使用 改为cast_embed/3

我有模型组织

defmodule Bonsai.Organization do
  use Bonsai.Web, :model
  alias Bonsai.OrganizationSettings
  schema "organizations" do
    field :name, :string
    field :currency, :string
    field :tenant, :string
    field :info, :map, default: %{}
    embeds_one :settings, OrganizationSettings, on_replace: :delete
    timestamps
  end
  @required_fields ~w(name currency tenant)
  @optional_fields ~w(info settings)
  @doc """
  """
  def changeset(model, params \ %{}) do
    cast(model, params, @required_fields, @optional_fields)
    |> cast_embed(:settings)
    |> put_embed(:settings, OrganizationSettings.changeset(%OrganizationSettings{}, params[:settings] || %{}))
    |> change(%{info: params[:info] || %{}})
  end
end

和我的嵌入式模型组织设置

defmodule Bonsai.OrganizationSettings do
  use Ecto.Model
  #use Ecto.Changeset
  @primary_key {:id, :binary_id, autogenerate: true}
  #schema "" do
  embedded_schema do
    field :show_search_on_focus, :boolean, default: true
    field :theme, :string, default: "bonsai"
  end
  def changeset(model, params \ %{}) do
    model
    |> cast(params, [:theme], [:show_search_on_focus])
    |> validate_inclusion(:theme, ["bonsai", "dark"])
  end
end

我已经尝试了很多方法,但我做错了什么,请帮助

我已经更新到 Ecto 2,更改是

# mix.exs
  defp deps do
    [{:phoenix, "~> 1.1.4"},
     {:postgrex, ">= 0.0.0"},
     {:phoenix_ecto, "~> 3.0.0-beta"},
     {:phoenix_html, "~> 2.5"},
     {:phoenix_live_reload, "~> 1.0", only: :dev},
     {:gettext, "~> 0.9"},
     {:cowboy, "~> 1.0"},
     {:poison, "~> 1.5.2"}]
  end

然后运行'mix deps.update,并编辑文件

  # In file test/support/model_case.ex
  setup tags do
    :ok = Ecto.Adapters.SQL.Sandbox.checkout(Bonsai.Repo)
  end
# In file test/test_helper.exs
#Ecto.Adapters.SQL.begin_test_transaction(Bonsai.Repo)
Ecto.Adapters.SQL.Sandbox.mode(Bonsai.Repo, :manual)

和我的模型组织变更集

def changeset(model, params \ %{}) do
    cast(model, params, [:name, :currency, :tenant])
    |> validate_required([:name, :currency, :tenant])
    |> cast_embed(:settings)
    |> put_embed(:settings, OrganizationSettings.changeset(%OrganizationSettings{}, params[:settings] || %{}))
    |> change(%{info: params[:info] || %{}})
  end

请参阅 https://github.com/elixir-ecto/ecto/blob/cc92f05cb2f24c3206db9017e6c28ecf77ff100d/CHANGELOG.md - 改进的变更集。您在此处使用已弃用的 cast/4:

铸造(模型,参数,@required_fields,@optional_fields)演员表(模型, 参数, [:主题], [:show_search_on_focus])

请改用 cast/3 和 validate_required/3,如示例中所示。

最新更新