2017-02-13 53 views
0

聲明:我是新來的鳳凰城和藥劑鳳凰/白 - 協議可枚舉沒有實現

我試圖創建一個查詢後端MySQL數據庫並獲取單個記錄一個非常基本的API,編碼到JSON並返回。

我有一個已經存在的MySQL數據庫,它是現有Python應用程序的一部分,我想在菲尼克斯重構應用程序,但保持數據庫不變,並讓新的Phoenix應用程序連接並查詢它。

因此,數據庫已經存在,我不創建一個新的模式我爲每個表定義我的模式,並把它們放在我的/ lib目錄。

我想查詢TestResultDetail表並獲得給定序列號的最後一個記錄。 TestResultDetail表與包含父記錄的TestResult表具有ManyToOne關係。

我收到以下錯誤,不知道如何補救:

Protocol.UndefinedError在GET/API/V2 /選擇/最後結果/ 113325-1002 協議可枚舉不#Ecto實施.Query

Error Message

應用程序結構:

enter image description here

這是我的視圖,其中錯誤發生:

defmodule Webservices.OPTView do 
    use Webservices.Web, :view 

    def render("index.json", %{results: results}) do 
     %{ 
     results: Enum.map(results, &result_json/1) 
     } 
    end 

    def render("last.json", %{results: results}) do 
     %{ 
     results: Enum.each(results, &last_result_json/1) 
     } 
    end 

    def result_json(result) do 
     %{ 
     id: result.id, 
     serial: result.serial, 
     date_added: result.date_added 
     } 
    end 

    def last_result_json(result) do 
     %{ 
     serial: result.serial, 
     station: result.station, 
     stage: result.stage, 
     operator: result.operator, 
     revision: result.sequence_rev 
     } 
    end 

end 

這是我的架構:(LIB/opt_test_result_detail.ex)

defmodule Webservices.TestResultDetail do 
    use Ecto.Schema 
    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 

    # fetch last recorded test result for a serial 
    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 

我的控制器:

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

    alias Webservices.Router 
    import Webservices.Router.Helpers 

# this is the main controller 

# def index(conn, %{"serial" => serial}) do 
#  import Ecto.Query 
# 
#  results = Webservices.TestResult 
#  |> where([p], p.serial == serial) 
#  |> Webservices.Repo.all 
# 
#  render(conn, "index.json", results: results) 
# 
# end 


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

     results = Webservices.TestResultDetail.last_completed_test(serial) 

     render(conn, "last.json", results: results) 
    end 
end 
+0

顯示控制器。可能你忘記了通過'Repo.one'傳遞查詢。 – Hauleth

+0

對不起,更新了我的控制器 – xXPhenom22Xx

回答

1

你忘記打電話Repo.one/1在您的視圖:

results = Webservices.TestResultDetail.last_completed_test(serial) 
      |> Repo.one 

但是它會更好,重構你的代碼有點

def last_completed_test(serial) do 
    from c in __MODEL__, 
    join: t in assoc(c, :results) 
    order_by: [desc: c.id], 
    where: t.serial == ^serial 
end 

同時,我認爲這一點:

has_many :result_id, Webservices.TestResult 

應該看起來像

belongs_to :results, Webservices.TestResult 
+0

對於Repo.one更改,您提到我的看法,不應該在控制器中嗎? 假設你沒有意思是,我更新了我的控制器(見上文),我收到以下錯誤 UndefinedFunctionError在GET/API/V2 /選擇/最後結果/ 113325-1002 功能的TestResult .__模式__/1未定義(模塊TestResult不可用) – xXPhenom22Xx

+0

另一個需要注意的是TestResultDetail模型與TestResult表具有FK(ManyToOne)關係。每個父TestResult記錄都會有很多TestResultDetail記錄。 – xXPhenom22Xx