为什么我得到协议 Enumerable not implemented for #Ecto.Query?
Why I get protocol Enumerable not implemented for #Ecto.Query?
尽管我将查询传递给受 启发的存储库,如下所示:
teams_users = Repo.all (from(t in Team, where: t.owner_id == ^user_id))
|> Enum.each( &team_users/1 )
def team_users (team) do
%{id: id} = team
Repo.all (from(tu in TeamUser, where: tu.team_id == ^id))
end
但是,我得到了这个错误:
[error] GenServer #PID<0.450.0> terminating
** (Protocol.UndefinedError) protocol Enumerable not implemented for #Ecto.Query<from t in App.Team, where: t.owner_id == ^1>
(elixir) lib/enum.ex:1: Enumerable.impl_for!/1
(elixir) lib/enum.ex:116: Enumerable.reduce/3
(elixir) lib/enum.ex:1477: Enum.reduce/3
(elixir) lib/enum.ex:609: Enum.each/2
(App) web/channels/user_channel.ex:93: App.UserChannel.handle_in/3
(phoenix) lib/phoenix/channel/server.ex:223: Phoenix.Channel.Server.handle_info/2
(stdlib) gen_server.erl:615: :gen_server.try_dispatch/4
(stdlib) gen_server.erl:681: :gen_server.handle_msg/5
(stdlib) proc_lib.erl:240: :proc_lib.init_p_do_apply/3
我想做的是获取所有团队,然后获取每个团队的用户,然后我希望将所有用户放在一个数组中。
我错过了什么吗?有什么建议吗?有没有更好的方法来实现这个?
所以你的这段代码有问题:
teams_users = Repo.all (from(t in Team, where: t.owner_id == ^user_id))
|> Enum.each( &team_users/1 )
您应该删除 Repo.all
和 (
之间的 space
teams_users = Repo.all(from(t in Team, where: t.owner_id == ^user_id))
|> Enum.each( &team_users/1 )
你也可以这样写:
teams_users =
from(t in Team, where: t.owner_id == ^user_id)
|> Repo.all()
|> Enum.each( &team_users/1 )
但是,这样做会引入 n + 1 查询。您将进行一个查询来获取您的团队,然后进行另一个查询来获取团队用户。您应该为此查看 Repo.preload/2。
teams_users =
from(t in Team, where: t.owner_id == ^user_id)
|> Repo.all()
|> Repo.preload(:team_users)
您将查询宏直接通过管道传输到 Enum.each,而不是使用 Repo.all 解析查询并将其发送到 Enum。
尽管我将查询传递给受
teams_users = Repo.all (from(t in Team, where: t.owner_id == ^user_id))
|> Enum.each( &team_users/1 )
def team_users (team) do
%{id: id} = team
Repo.all (from(tu in TeamUser, where: tu.team_id == ^id))
end
但是,我得到了这个错误:
[error] GenServer #PID<0.450.0> terminating
** (Protocol.UndefinedError) protocol Enumerable not implemented for #Ecto.Query<from t in App.Team, where: t.owner_id == ^1>
(elixir) lib/enum.ex:1: Enumerable.impl_for!/1
(elixir) lib/enum.ex:116: Enumerable.reduce/3
(elixir) lib/enum.ex:1477: Enum.reduce/3
(elixir) lib/enum.ex:609: Enum.each/2
(App) web/channels/user_channel.ex:93: App.UserChannel.handle_in/3
(phoenix) lib/phoenix/channel/server.ex:223: Phoenix.Channel.Server.handle_info/2
(stdlib) gen_server.erl:615: :gen_server.try_dispatch/4
(stdlib) gen_server.erl:681: :gen_server.handle_msg/5
(stdlib) proc_lib.erl:240: :proc_lib.init_p_do_apply/3
我想做的是获取所有团队,然后获取每个团队的用户,然后我希望将所有用户放在一个数组中。
我错过了什么吗?有什么建议吗?有没有更好的方法来实现这个?
所以你的这段代码有问题:
teams_users = Repo.all (from(t in Team, where: t.owner_id == ^user_id))
|> Enum.each( &team_users/1 )
您应该删除 Repo.all
和 (
teams_users = Repo.all(from(t in Team, where: t.owner_id == ^user_id))
|> Enum.each( &team_users/1 )
你也可以这样写:
teams_users =
from(t in Team, where: t.owner_id == ^user_id)
|> Repo.all()
|> Enum.each( &team_users/1 )
但是,这样做会引入 n + 1 查询。您将进行一个查询来获取您的团队,然后进行另一个查询来获取团队用户。您应该为此查看 Repo.preload/2。
teams_users =
from(t in Team, where: t.owner_id == ^user_id)
|> Repo.all()
|> Repo.preload(:team_users)
您将查询宏直接通过管道传输到 Enum.each,而不是使用 Repo.all 解析查询并将其发送到 Enum。