声明:我是新来的凤凰城和药剂凤凰/白 - 协议可枚举没有实现
我试图创建一个查询后端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