【问题标题】:Inserting id of child into the parent model Elixir/Phoenix将孩子的 id 插入父模型 Elixir/Phoenix
【发布时间】:2016-09-17 06:36:45
【问题描述】:

所以这是我的问题:我有两个架构:表格和订单

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 插入到 parent(table) 到 current_order 字段中?

此外,当 order.completed 更改为“true”值时,如何从 current_order(表中)中删除 id?

基本上,我正在研究功能,如果表格有 current_order - 它会在点击时显示它。如果没有,那么它会重定向到一个页面来创建订单。并创建一个订单,应分配表中的 current_order。

【问题讨论】:

标签: phoenix-framework elixir


【解决方案1】:

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

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

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

【讨论】:

  • 是的!谢谢!除了我改变了 Repo.insert!对 Repo.update 的更改!变更集,因为它返回“* unique:tables_pkey”错误。
  • 是的,你是对的,表已经存在。然后我会编辑答案。
猜你喜欢
  • 2017-04-23
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多