聲明:我是新來的鳳凰城和藥劑鳳凰/白 - 協議可枚舉沒有實現
我試圖創建一個查詢後端MySQL數據庫並獲取單個記錄一個非常基本的API,編碼到JSON並返回。
我有一個已經存在的MySQL數據庫,它是現有Python應用程序的一部分,我想在菲尼克斯重構應用程序,但保持數據庫不變,並讓新的Phoenix應用程序連接並查詢它。
因此,數據庫已經存在,我不創建一個新的模式我爲每個表定義我的模式,並把它們放在我的/ lib目錄。
我想查詢TestResultDetail表並獲得給定序列號的最後一個記錄。 TestResultDetail表與包含父記錄的TestResult表具有ManyToOne關係。
我收到以下錯誤,不知道如何補救:
Protocol.UndefinedError在GET/API/V2 /選擇/最後結果/ 113325-1002 協議可枚舉不#Ecto實施.Query
應用程序結構:
這是我的視圖,其中錯誤發生:
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
顯示控制器。可能你忘記了通過'Repo.one'傳遞查詢。 – Hauleth
對不起,更新了我的控制器 – xXPhenom22Xx