Отказ от ответственности: Я новичок в Фениксе и эликсирPhoenix/Elixir - протокол перечислимый не реализован
Я пытаюсь создать довольно базовый API, который запрашивает базу данных бэкэнда MySQL и извлекает одну записи, кодирует в JSON и возвращается.
У меня есть уже существующая база данных MySQL, которая является частью существующего приложения Python, я хочу реорганизовать приложение в Phoenix, но сохранить базу данных как есть и подключить новое приложение Phoenix и запросить его.
Так что, поскольку база данных уже существует, и я не создаю новую схему, я определил свою схему для каждой таблицы и поместил ее в каталог/lib.
Я пытаюсь запросить таблицу TestResultDetail и получить последнюю запись для данного серийного номера. Таблица TestResultDetail имеет отношение ManyToOne к таблице TestResult, которая содержит родительскую запись.
Я получаю следующее сообщение об ошибке и не знает, как исправить:
Protocol.UndefinedError на GET/апи/v2/Opt/последний результат/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
Вот моя схема: (Библиотека/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