2016-03-21 8 views
1

ich diese Warnung erhalten, wennEcto Warnung mit eingebettetem Modell

Warnung Gießen: Gießen bettet mit Guss/4 ist veraltet, verwenden Sie bitte /3 cast_embed statt

Ich habe das Modell Organisation

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 

Und mein Embedded Modell OrganizationSettings

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 

Ich habe viele Wege versucht, aber ich mache etwas falsch bitte helfen

Antwort

0

Siehe https://github.com/elixir-ecto/ecto/blob/cc92f05cb2f24c3206db9017e6c28ecf77ff100d/CHANGELOG.md - Überarbeitete Changesets. Sie verwenden Guss/4 hier veraltet:

Besetzung (Modell, params, @required_fields, @optional_fields) Besetzung (Modell, params [: Thema], [: show_search_on_focus])

Verwenden Sie stattdessen cast/3 und validate_required/3 wie dort im Beispiel dargestellt.

+0

Ich habe versucht, validate_required zu verwenden, aber es ist nur auf Ecto 2 verfügbar, vielleicht sollte ich versuchen, die Beta-Version für jetzt zu verwenden. –

+0

Danke für die Hilfe, ich habe eine umfassendere Antwort erstellt, aber Ihr Leitfaden hilft wirklich bei der Lösung jedes einzelnen Schrittes –

0

Ich habe Ecto aktualisiert 2 und die Änderungen sind

# 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 

Dann `laufen deps.update mischen und bearbeiten Sie die Dateien

# 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) 

Und changeset mein Modell Organisation

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