(FunctionClauseError) нет совпадений с функциональными предложениями в Access.get / 3 - PullRequest
0 голосов
/ 04 июня 2018

Я новичок в Elixir и в настоящее время совершаю транзакцию из Ruby.Я изо всех сил пытаюсь обойти ошибку, которую я получаю, и из-за того, что Elixir не имеет object.class, я изо всех сил пытаюсь понять, какой тип данных я возвращаю назад и как устранить его.

В любом случае я пытаюсь заполнить базу данных из CSV, но получаю сообщение об ошибке

Ниже приведен мой код

File.stream!('users_departs.csv')
|> Stream.drop(1)
|> CSV.decode(headers: [:name, :title, :departments])
|> Enum.take(10
|> Enum.each( fn(x) -> IO.inspect(x[:ok]) end )

 Error

** (FunctionClauseError) no function clause matching in Access.get/3

The following arguments were given to Access.get/3:

    # 1
    {:ok,
     %{
       departments: "Sales|Marketing",
       name: "John Smith",
       title: "Customer Service"
     }}

    # 2
    :ok

    # 3
    nil
(elixir) lib/access.ex:306: Access.get/3
(stdlib) erl_eval.erl:670: :erl_eval.do_apply/6
(stdlib) erl_eval.erl:878: :erl_eval.expr_list/6

У меня есть 2 модели, Пользователь и Отделы, иЯ хотел бы сначала заполнить отделы, затем создать пользователя, а затем связать сопоставление отделов пользователей, но я пытаюсь пройти этот шаг.

Любая помощь будет оценена

1 Ответ

0 голосов
/ 04 июня 2018

Access.get/3 - это функция эликсира, которая согласно документации:

Получает значение для данного ключа в контейнере (карта, список ключевых слов,или структура, которая реализует поведение Access)

Проверьте сообщение об ошибке,

{:ok,
   %{
     departments: "Sales|Marketing",
     name: "John Smith",
     title: "Customer Service"}}

это не «карта, список ключевых слов или структура и т. д.» Это кортеж , состоящий из :ok атома и карты.

Кажется, CSV.decode(headers: [:name, :title, :departments]) возвращает {:ok, value_decode}.

Таким образом, вы не можете передать его на Enum.take/2 как есть.

Просто

{:ok, decode_csv} =
  File.stream!('users_departs.csv')
  |> Stream.drop(1)
  |> CSV.decode(headers: [:name, :title, :departments])

decode_csv
|> Enum.take(10)
|> Enum.each( fn(x) -> IO.inspect(x[:ok]) end )
...