2017-01-24 1 views
0

Ich benutze das Phoenix Web Framework (Elixir), um einen Python-basierten API-Lieferdienst neu zu schreiben, den wir haben, und stoße auf ein kleines Problem.Phoenix Ecto - Variable in Modell Methode

Ich versuche, eine grundlegende Modellmethode zu erstellen, bei der man beim Aufruf eine Seriennummer erhält, die Datenbank über Ecto abfragt und das Ergebnis zurückliefert. Wenn ich durch die Dokumentation schaue, sollte ich in der Lage sein, Interpolation zu verwenden, um die Variable in der Abfrage zu definieren, aber ich bekomme immer noch einen Fehler.

lib/test_result.ex Datei

defmodule Webservices.TestResult do 
    use Ecto.Schema 

     schema "test_result" do 
      field :date_added, Ecto.DateTime 
      field :serial, :string 
      field :sequence_id, :integer 
      field :last_completed_stage, :integer 
      field :last_completed_sequence, :integer 
      field :workorder, :string 
      field :product, :string 
      field :is_complete, :integer 
      field :is_scrapped, :integer 
      field :value_stream, :string 
      field :promise_date, Ecto.Date 
      field :fail_lock, :integer 
      field :sequence_rev, :integer 
      field :date_updated, Ecto.DateTime 
      field :date, Ecto.Date 
      field :time, Ecto.Time 
      field :ptyp2, :string 
      field :wo_qty, :integer 
      field :is_active, :integer 
      field :is_time_lock, :integer 
      field :time_lock_timestamp, Ecto.DateTime 
      field :scrap_reason, :string 
      field :scrapped_by, :integer 
     end 
    end 

lib/test_result_detail.ex Datei

defmodule Webservices.TestResultDetail do 
    use Ecto.Schema, :model 
    import Ecto.Query 

    schema "test_result_detail" do 
    field :status_id, :integer 
    field :station_id, :integer 
    field :stage_id, :integer 
    field :operator_id, :integer 
    field :failstep, :string 
    field :shift, :integer 
    field :sequence_rev, :integer 
    field :date_added, Ecto.Date 
    field :date_timestamp, Ecto.DateTime 
    field :date_time, Ecto.Time 
    field :stage_order, :integer 
    field :serial_number, :string 
    field :is_retest, :integer 
    field :retest_reason, :string 

    has_many :result_id, Webservices.TestResult 
end 


    def last_completed_test(serial) do 
    from c in Webservices.TestResultDetail, 
     join: t in TestResult, on: t.id == c.result_id, 
     select: {t.serial, c.station_id, c.stage_id, c.operator_id, c.sequence_rev}, 
     where: t.serial == ^serial, 
     order_by: [desc: c.id], 
     limit: 1 
    end 

end 

Mein Controller:

defmodule Webservices.OPTController do 
    use Webservices.Web, :controller 

    alias Webservices.Router 
    import Webservices.Router.Helpers 

    def last(conn, %{"serial" => serial}) do 
     import Ecto.Query 

     results = Webservices.TestResultDetail.last_completed_test(serial) 
     render(conn, "last.json", results: results) 

    end 
end 

Ich erhalte die folgende Compiler-Fehler:

== Compilation error on file web/controllers/opt_controller.ex == ** (Ecto.Query.CompileError) variable serial is not a valid query expression. Variables need to be explicitly interpolated in queries with^ expanding macro: Ecto.Query.where/3 web/controllers/opt_controller.ex:12: Webservices.OPTController.index/2 (elixir) expanding macro: Kernel.|>/2 web/controllers/opt_controller.ex:13: Webservices.OPTController.index/2 (elixir) lib/kernel/parallel_compiler.ex:117: anonymous fn/4 in Kernel.ParallelCompiler.spawn_compilers/1

+0

'wo: c.serial ==^seriell' ->' wo: c.serial_number ==^seriell' – JustMichael

+0

Eher 't'. Ich habe eine Antwort erstellt. – PatNowak

+0

c.serial ist eine FK-Verknüpfung zu einer anderen Tabelle, in der sich ein serielles Feld befindet. Das Feld serial_number wird in der Tabelle test_result_detail nicht verwendet. Entschuldigung für die Verwirrung. Ich aktualisierte meine Frage über – xXPhenom22Xx

Antwort

0

Sie trat zwei Tabellen und in Ihrem t Tabelle gibt es :serial Feld. In c gibt es :serial_number. Wenden Sie einfach diese where Klausel auf t.serial == ^serial an.

+0

Das war ein eindeutiger fetter Finger, der schön gefangen wurde. Ich habe aktualisiert, sehe aber immer noch denselben Fehler. – xXPhenom22Xx

+0

Äh, das war eigentlich das Problem zusammen mit einem anderen Tippfehler, den ich in einer anderen Datei hatte. – xXPhenom22Xx

Verwandte Themen