Феникс: changeset не учитывает изменения внешних ключей

Я пытаюсь обновить значения для записи в консоли ies -S mix,

iex> video = Repo.one(from v in Video, limit: 1)
%Rumbl.Video{...}

если я изменю название видео, кажется, все работает правильно.

iex> changeset = Video.changeset(video, %{title: "some title"})
#Ecto.Changeset<action: nil, changes: %{title: "some title"}, 
errors: [], data: #Rumbl.Video<>, valid?: true>

Но изменение внешнего ключа, кажется, не имеет никакого эффекта:

iex> changeset = Video.changeset(video, %{category_id: 3})
#Ecto.Changeset<action: nil, changes: %{},
errors: [], data: #Rumbl.Video<>, valid?: true>

Что мне нужно сделать, чтобы изменения внешнего ключа были учтены?

Вот модель

defmodule Rumbl.Video do
  use Rumbl.Web, :model

  schema "videos" do
    field :url, :string
    field :title, :string
    field :description, :string
    belongs_to :user, Rumbl.User, foreign_key: :user_id
    belongs_to :category, Rumbl.Category, foreign_key: :category_id

    timestamps()
  end

  @required_fields ~w(url title description)
  @optional_fields ~w(category_id)

  @doc """
  Builds a changeset based on the `struct` and `params`.
  """
  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, @required_fields, @optional_fields)
    |> validate_required([:url, :title, :description])
    |> assoc_constraint(:category)
  end

конец

1 ответ

Решение

В Ecto 2.2 четвертый аргумент cast есть опции, а не дополнительные поля. Раньше это были необязательные поля, которые устарели в v2.1 с рекомендацией использовать validate_required вместо. Это было очевидно удалено в v2.2.0, хотя я не могу найти его в журнале изменений. Вы должны изменить свой код на это для Ecto 2.2:

struct
|> cast(params, @required_fields ++ @optional_fields)
|> validate_required([:url, :title, :description])

или сделайте это:

@required_fields ~w(url title description)a
@optional_fields ~w(category_id)a

а также

|> cast(params, @required_fields ++ @optional_fields)
|> validate_required(@required_fields)
Другие вопросы по тегам