所以这是我的问题:我有两个模式:表和订单
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。
答案 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
应该使用更好的机制来确保插入成功以及如果不是(使用事务和回滚可能)该怎么做。