2017-06-07 5 views
0

私はエリクシール/フェニックスを勉強していて、私の前に仕事があります。私は1つのサイクルでデータベースからの結果をフィルタリングする必要があります。このようなもの:エリクサー/フェニックスのサイクルでリストに追加する方法

user = Repo.get_by(User, api_token: token) 
rooms = Repo.all(Room) 
result = [] 
if !Enum.empty?(rooms) do 
    Enum.each rooms, fn room -> 
    users = Poison.decode!(room.users) 
    if Enum.member?(users, user.id) do 
     result = result ++ [room] 
    end 
    end 
end 
json(conn, %{"rooms" => result}) 

この場合、リストに項目を追加することはできません。なぜですか?これは機能的な言語なので... サイクル内でリストに項目を追加する方法はありますか?

あなたは私に "なぜあなたはデータベースからオブジェクトIDを取得しないのですか?"私はroom.usersは文字列にエンコードされたjson配列を格納すると言います

答えて

1

リストからいくつかの項目を選択したいときはいつでも、Enum.filter/2を使うことができます。 Enum.member?/2の代わりにin演算子を使用することもできます。

user = Repo.get_by(User, api_token: token) 
rooms = Repo.all(Room) 
result = Enum.filter(rooms, fn room -> 
    user.id in Poison.decode!(room.users) 
end) 

またEnum.filter/2の代わりにforを使用することができます。

result = for room <- rooms, user.id in Poison.decode!(room.users), do: room 
+0

感謝を。それは仕事ですが、実際にそれを1つのサイクルでフィルタリングする方法はありますか?これはすべての場合に機能しないようです。 –

+0

リストを反復しながら変数を任意に変更したい場合は、 'Enum.reduce/3'を使用できます。ここに、 'Enum.reduce/3'を使用した私の答えのいくつかがあります:https://stackoverflow.com/search?tab=newest&q=user%3a320615%20%5belixir%5d%20Enum.reduce – Dogbert

関連する問題