2017-06-13 20 views
2

我想從數據庫獲取多個記錄並將其放入數組或地圖中。如何從數據庫中獲取多個記錄並將其放入數組或地圖

這是我與用戶ID

{"array":[133,136,137] } 

樣本陣列,這是我的代碼

def array(conn, %{"array" => array}) do 
     userlist = %{} 
     Enum.each(array, fn(x) -> 
     Map.put(userlist, x, Repo.get(ApiDb.User, x)) 
     end) 
     json conn, userlist 
    end 

但此方法返回空數組

下面

在控制檯輸出

enter image description here

回答

3

我覺得這種方法比@ Dogbert的一個(糾正我,如果我錯了),因爲我們要求直接外生格式化的元組的每一行則更加優化我們使用內置的Enum.into/2將元組列表轉換爲映射。對於這一點,你會希望你當前模塊中導入Ecto.Query和:

query = from user in ApiDb.User, 
     where: user.id in ^user_ids, 
     select: {user.id, user} 

Repo.all(query) |> Enum.into(%{}) 

這將產生

%{id1 => user1, id2 => user2...}

對於毒編碼的問題,我沒有遇到有關轉換的任何問題數字鍵,因爲它們被Poison自動轉換爲字符串。

希望這也有助於:)

2

您無法從Enum.each內修改Enum.each以外的變量值。對於這個特定的情況下,我會使用一個for通過列表進行迭代,獲取用戶,並把它放在一個地圖id爲關鍵:

def array(conn, %{"array" => array}) do 
    users = for x <- array, into: %{}, do: {"#{x}", Repo.get(ApiDb.User, x)} 
    json conn, users 
end 

我使用id IN _查詢建議使這裏所有記錄在一個查詢中被提取:

def array(conn, %{"array" => array}) do 
    users = from(u in ApiDb.User, where: u.id in ^array) |> Repo.all 
    map = for user <- users, into: %{}, do: {"#{user.id}", user} 
    json conn, map 
end 
+0

都得到**(Poison.EncodeError)期望的字符串或原子鍵,得到:133錯誤。 我有在lib文件夾中的Poison.Encoder。 defimpl Poison.Encoder,爲:任何不 DEF編碼(%{__ struct__:_} =結構,選項)做 地圖=結構 |> Map.from_struct |> sanitize_map |> Poison.Encoder.Map。編碼(選項) #Poison.Encoder.Map.encode(地圖,選項) 端 defp sanitize_map(地圖)做 Map.drop(地圖,[:__ meta__,:__ struct__]) 端 端 – smartechno

+0

I」已經更新了將鍵轉換爲字符串的答案。這應該工作。讓我知道。 – Dogbert

+0

完美無瑕 – smartechno

相關問題