将子ID插入父模型Elixir / Phoenix

时间:2016-05-20 06:13:46

标签: elixir phoenix-framework elixir-framework

所以这是我的问题:我有两个模式:表和订单

schema "tables" do
field :table_number, :string
field :current_order, :integer
has_many :orders, Pos1.Order

schema "orders" do
field :number_of_customers, :integer
field :completed, :boolean, default: false
belongs_to :table, Pos1.Table

当我创建新订单时,控制器只需插入变更集并重定向即可显示。

def create(conn, %{"order" => order_params}) do
  changeset = conn.assigns[:table]
  |> build_assoc(:orders)
  |> Order.changeset(order_params)
  case Repo.insert(changeset) do
  {:ok, _order} ->
    conn
    |> put_flash(:info, "Order created successfully.")
    |> redirect(to: table_order_path(conn, :show, conn.assigns[:table], _order))
  {:error, changeset} ->
    render(conn, "new.html", changeset: changeset)
   end
   end

但是,是否可以将创建的订单的ID插入到current_order字段中的父(表)中?

此外,当order.completed更改为" true"值,如何从current_order中移除id(在表中)?

基本上,我正在研究功能,如果表有current_order - 它会显示它onclick。如果没有,则重定向到页面以创建订单。并且创建了一个订单,应该分配表中的current_order。

1 个答案:

答案 0 :(得分:3)

没有完全理解你的问题,但这是你想要的吗?

def create(conn, %{"order" => order_params}) do
  changeset = conn.assigns[:table]
  |> build_assoc(:orders)
  |> Order.changeset(order_params)
  case Repo.insert(changeset) do
  {:ok, order} ->

    changeset = Table.changeset(conn.assigns[:table], %{current_order: order.id})
    table     = Repo.update! changeset

    conn
    |> put_flash(:info, "Order created successfully.")
    |> redirect(to: table_order_path(conn, :show, conn.assigns[:table], _order))
  {:error, changeset} ->
    render(conn, "new.html", changeset: changeset)
   end
   end

应该使用更好的机制来确保插入成功以及如果不是(使用事务和回滚可能)该怎么做。