未为 MyApp.MyStruct 实现协议可枚举

Posted

技术标签:

【中文标题】未为 MyApp.MyStruct 实现协议可枚举【英文标题】:Protocol Enumerable not implemented for MyApp.MyStruct 【发布时间】:2018-05-22 05:00:53 【问题描述】:

我正在尝试创建一个连接表,并且在尝试构建一个结构时遇到了这个错误。

错误

protocol Enumerable 未为 %Statcasters.UsersLeaguesmeta 实现:#Ecto.Schema.Metadata<:built>,专员:nil,id:nil,inserted_at:nil,league :#Ecto.Association.NotLoaded,league_id:nil,updated_at:nil,用户:#Ecto.Association.NotLoaded,user_id:nil。该协议适用于:DBConnection.PrepareStream、DBConnection.Stream、Date.Range、Ecto.Adapters.SQL.Stream、File.Stream、Function、GenEvent.Stream、HashDict、HashSet、IO.Stream、List、Map、MapSet、 Postgrex.Stream, Range, Stream, Timex.Interval

这条线失败了:

联赛控制器:

  def new(conn, _params) do
    changeset = League.changeset(%Leagueusers_leagues: %UsersLeagues)

    render(conn, "new.html", changeset: changeset)
  end

我与联盟和用户建立了 has_many 关系。连接表是 users_leages 表,这就是我试图在新操作中创建的。但是当我尝试加载新页面时。它因这个错误而中断。

【问题讨论】:

尝试将%UsersLeagues 更改为[%UsersLeagues] 成功了!但我不明白为什么? 【参考方案1】:

该错误意味着 Ecto 试图将字段 users_leagues 的值用作 Enumerable,而 %UsersLeagues 不是。由于该字段是 has_many 字段,因此一条记录可以包含多个字段,并且它需要是 %UsersLeagues 结构的列表(或更具体地说是一个 Enumerable)。

您可以通过将%UsersLeagues 包装在一个列表中来解决此问题:

changeset = League.changeset(%Leagueusers_leagues: [%UsersLeagues])

【讨论】:

以上是关于未为 MyApp.MyStruct 实现协议可枚举的主要内容,如果未能解决你的问题,请参考以下文章

Elixir HashDict (Protocol.UndefinedError) 协议 Enumerable 未为 1, 1, 1 实现

协议可枚举未实现 - Elixir

未为 UITextView 触发委托协议功能

Winforms:运行 oledb 连接时出错(可安装的 Isam,未为命令对象设置 Commandtext)

RuntimeError:“exp”未为“torch.LongTensor”实现

如何在 Swift 中确认对 Identifiable 协议的枚举?