2016-05-20 56 views
2

因此,這裏是我的問題:我有兩個模式:表和訂單插入孩子的ID到父模型藥劑/鳳凰

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

試試這個 - https://github.com/elixir-lang/ecto/issues/1114 – coderVishal

+1

OFF-TOPIC:我也推薦在你的代碼中應用Elixir風格指南:https://github.com/niftyn8/el​​ixir_style_guide它使其他人更容易閱讀。甚至有一個工具可以檢查它並報告所有問題:https://github.com/rrrene/credo如果其他人閱讀它,你可以編輯你的問題並正確設置代碼:) – tkowal

+0

@tkowal thanks for鏈接!我會檢查出來 – Ilya

回答

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 

更好的機制應該是使用,以確保插入是成功的,做什麼,如果它不是(使用事務和回滾可能)。

+1

是的!謝謝!除了我改變了Repo.insert!更改爲Repo.update!更改集,因爲它返回「* unique:tables_pkey」錯誤。 – Ilya

+0

是的,你是對的表已經存在。然後我會編輯答案。 –