我是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
我有两个模型,用户和部门,我想首先播种部门,然后创建一个用户,然后关联用户部门映射,但我很难通过这一步。
任何帮助将不胜感激
答案 0 :(得分:0)
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 )