Феникс Эликсир Пост JSON с ассоциацией - PullRequest
0 голосов
/ 28 ноября 2018

Я хочу отправить сообщение для связи один ко многим с JSON в Phoenix Elixir.В Интернете есть много примеров, но я не видел ни одного примера, связанного один-ко-многим.Как передать параметры для контакта в контроллере?

Схема для Costumer равна

schema "customers" do
  field :email, :string
  field :name, :string
  has_many :contacts, App.Customers.Contact

  timestamps()
end

@doc false
def changeset(customer, attrs \\ %{}) do
  customer
  |> cast(attrs, [:name, :email])
  |> validate_required([:name, :email])
  |> unique_constraint(:email)
end

Схема для Contact равна

schema "contacts" do
  field :phone, :string
  belongs_to :customers, App.Customers.Customer,  foreign_key: :customer_id

  timestamps()
end

@doc false
def changeset(contact, attrs \\ %{}) do
  contact
  |> cast(attrs, [:phone])
  |> validate_required([:phone])
end

Это контроллер:

def create(conn, %{"email" => email, "name" => name, "phone" => phone} = customer_params) do
  with {:ok, %Customer{} = customer} <- Customers.create_customer(customer_params) do
    conn
    |> put_status(:created)
    |> put_resp_header("location", Routes.customer_path(conn, :show, customer))
    |> render("show.json", customer: customer)
  end
end

1 Ответ

0 голосов
/ 29 ноября 2018

В Customer измените функцию changeset на:

def changeset(customer, attrs \\ %{}) do
  customer
  |> cast(attrs, [:name, :email])
  |> validate_required([:name, :email])
  |> unique_constraint(:email)
  |> cast_assoc(:contacts)
end

и затем передайте параметры следующим образом:

%{"name" => "john doe", "email" => "example@example.com", "contacts" => [
  %{"phone" => "555-555-555"},
  %{"phone" => "555-555-555"}
]}

При этом функция create_customerв контексте не нужно изменять:

def create_customer(attrs \\ %{}) do
  %Customer{}
  |> Customer.changeset(attrs)
  |> Repo.insert()
end

Имейте в виду, однако, что для обновления Customer вам необходимо сначала предварительно загрузить контакты.

Вы можете найти больше информации в документации cast_assoc .

...