2016-03-21 2 views
1

я получаю это предупреждение при литьеEcto предупреждение со встроенной моделью

предупреждение: литье встраивает с литой/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 

И мой встроенный модель 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 

Я перепробовал много способов, но я делаю что-то не так, пожалуйста, помогите

ответ

0

См https://github.com/elixir-ecto/ecto/blob/cc92f05cb2f24c3206db9017e6c28ecf77ff100d/CHANGELOG.md - переделан ревизии. Вы используя осуждается отливать/4 здесь:

произнесения (модель, PARAMS, @required_fields, @optional_fields) литая (модель, Титулы, [: тема], [: show_search_on_focus])

Вместо этого, используйте cast/3 и validate_required/3, как представлено в этом примере.

+0

Я попытался использовать validate_required, но он доступен только на Ecto 2, возможно, я должен попытаться использовать бета-версию на данный момент. –

+0

Спасибо за помощь, я создал более полный ответ, но ваш гид действительно помогает решить каждый шаг –

0

Я обновил до 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 

Затем запустите `смешайте 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 
Смежные вопросы