2017-02-13 15 views
0

Отказ от ответственности: Я новичок в Фениксе и эликсирPhoenix/Elixir - протокол перечислимый не реализован

Я пытаюсь создать довольно базовый API, который запрашивает базу данных бэкэнда MySQL и извлекает одну записи, кодирует в JSON и возвращается.

У меня есть уже существующая база данных MySQL, которая является частью существующего приложения Python, я хочу реорганизовать приложение в Phoenix, но сохранить базу данных как есть и подключить новое приложение Phoenix и запросить его.

Так что, поскольку база данных уже существует, и я не создаю новую схему, я определил свою схему для каждой таблицы и поместил ее в каталог/lib.

Я пытаюсь запросить таблицу TestResultDetail и получить последнюю запись для данного серийного номера. Таблица TestResultDetail имеет отношение ManyToOne к таблице TestResult, которая содержит родительскую запись.

Я получаю следующее сообщение об ошибке и не знает, как исправить:

Protocol.UndefinedError на GET/апи/v2/Opt/последний результат/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 

Вот моя схема: (Библиотека/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/апи/v2/Opt/последний результат/113325-1002 функция TestResult .__ схемы __/1 является undefined (модуль TestResult недоступен) – xXPhenom22Xx

+0

И еще одно примечание: модель TestResultDetail имеет отношение FK (ManyToOne) к таблице TestResult. Будет много записей TestResultDetail для каждой родительской записи TestResult. – xXPhenom22Xx