2017-12-10 8 views
0

私はこの機能を持っています:レコードのリストと比較して、その2つの間に一致があるかどうかを調べようとしています。2つのリストをelixirと比較する一致する場合はtrueを返します

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

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

これは、レコードが1つしかなく、一致している場合にfalseを返すためですが、これは機能しません。

どのように言うことができます: "このレコードのリストを見て、これらのうちのどれもこの他のリスト内で一致しますか?"エリクサーで?

それはRubyでこれを次のようになります。

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

(list_1 & list_2).any? => true 

答えて

3

は、元の質問に答えるために、あなたはこれを行うことができます。

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

しかし、より良い方法は、別のクエリを使用することです - 1をどのチェックteamsの任意iduser.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となります。

関連する問題