2017-02-13 17 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