2016-05-20 6 views
2

hier ist also meine Frage: Ich habe zwei Schemata: Tabelle und BestellenEinsetzen ID des Kindes in das übergeordnete Modell Elixir/Phoenix

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 

Wenn ich einen neuen Auftrag erstellen, Controller nur die changeset Einsätze und leiten zu Show.

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 

Jedoch ist es möglich, die ID der erzeugten, um in die übergeordneten (Tabelle) in die current_order Feld einfügen?

Darüber hinaus, wenn die order.completed zu "True" -Wert ändert, wie kann ich die ID aus current_order (in der Tabelle) entfernen?

Grundsätzlich arbeite ich an der Funktionalität, dass, wenn die Tabelle current_order hat - es onclick zeigen wird. Wenn nicht, wird auf eine Seite umgeleitet, um eine Reihenfolge zu erstellen. Und eine Bestellung wird erstellt, current_order in der Tabelle sollte zugewiesen werden.

+0

versuchen Sie das - https://github.com/elixir-lang/ecto/issues/1114 – coderVishal

+1

OFF-THEMA: Ich empfehle auch, Elixir Style Guide auf Ihren Code anzuwenden: https://github.com/niftyn8/elixir_style_guide Es erleichtert das Lesen für andere Menschen. Es gibt sogar ein Tool, das es für Sie überprüft und alle Probleme meldet: https://github.com/rrrene/credo Sie können Ihre Frage bearbeiten und den Code richtig formatieren, falls andere Leute ihn lesen :) – tkowal

+0

@tkowal thanks for der Link! Ich werde es überprüfen – Ilya

Antwort

3

Ihr Problem wurde nicht vollständig verstanden, aber möchten Sie das?

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 

Bessere Mechanismen sollten Gebrauch sicherzustellen, dass das Einfügen erfolgreich war und was zu tun ist, wenn es nicht ist (vielleicht Transaktionen und Rollbacks verwenden).

+1

Ja! Vielen Dank! Außer ich habe Repo.insert geändert! Changeset zu Repo.update! changeset, weil es den Fehler "* unique: tables_pkey" zurückgegeben hat. – Ilya

+0

Ja, du hast Recht, die Tabelle existiert bereits. Ich werde dann die Antwort bearbeiten. –

Verwandte Themen