比较两个列表与elixir如果匹配则返回true

时间:2017-12-10 01:18:09

标签: elixir phoenix-framework

我有这个功能:我试图比较记录列表,看看两者之间是否匹配。

def current_user_has_team?(user, teams) do
  user = user |> Repo.preload(:teams)

  Enum.member?(user.teams, teams)
end

这不起作用,因为当只有一条记录且它们匹配时,它返回false。

我该怎么说:"看看这个记录列表,在这个其他列表中做这些匹配吗?"在Elixir?

这将是Ruby:

list_1 = [1,2,3]
list_2 = [3,4,5]

(list_1 & list_2).any? => true

1 个答案:

答案 0 :(得分:3)

要回答原始问题,您可以这样做:

Enum.any?(user.teams, fn team -> team in teams end)

但更好的方法是使用不同的查询 - 检查id中是否存在teams user.teams的任何查询:

def current_user_has_team?(user, teams) do
  ids = Enum.map(teams, & &1.id)
  !!Repo.one(from(team in assoc(user, :teams), where: team.id in ^ids, limit: 1))
end

如果没有匹配,查询将返回nil,如果有,则返回第一个匹配的团队。 !!会将此变为布尔值,这将使匹配返回true并且非匹配返回false