如果匹配,则使用 E​​lixir 比较两个列表返回 true

Bit*_*ise 1 elixir phoenix-framework

我有这个功能:我正在尝试与记录列表进行比较,以查看两者之间是否匹配。

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

  Enum.member?(user.teams, teams)
end
Run Code Online (Sandbox Code Playgroud)

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

我怎么说:“看看这个记录列表,这些记录是否与另一个列表匹配?” 在长生不老药?

在 Ruby 中是这样的:

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

(list_1 & list_2).any? => true
Run Code Online (Sandbox Code Playgroud)

Dog*_*ert 5

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

Enum.any?(user.teams, fn team -> team in teams end)
Run Code Online (Sandbox Code Playgroud)

但更好的方法是使用不同的查询-其中之一,如果任何检查idteams在存在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
Run Code Online (Sandbox Code Playgroud)

nil如果没有匹配项,则查询将返回,如果有,则返回第一个匹配的团队。该!!会变成一个布尔值,which'll进行匹配的回报true和非匹配的回报false