2017-03-25 65 views
3

我想插入一組類似的實體並一舉獲得每個實體的ID。我想這樣的:將循環結果保存到變量列表中

q1 = "question1" 
q2 = "question2" 
q3 = "question3" 
q4 = "question4" 

Enum.each([q1, q2, q3, q4], &(Repo.insert!(......))) 

# working with q1 and id of q1 
# ....... 


# working with q2 and id of q2 
# ....... 

# and so on 

有沒有什麼辦法,也許,創造一個我存儲由Repo.insert返回的結果模型的變量第二列表? 如果沒有,那麼我將如何訪問每個插入模型的「id」:q1-q4? 或者我應該改爲一個接一個地插入它們,它會更容易,更直接?

回答

1

您正在尋找Enum.map/2

ids = [q1, q2, q3, q4] 
|> Enum.map(&Repo.insert!(......)) 
|> Enum.map(&Map.get(&1, :id)) 

你也可以做到這一點的步驟:

structs = Enum.map([q1, q2, q3, q4], &Repo.insert!(......)) 
ids  = Enum.map(ids, &Map.get(&1, :id)) 
+0

肯定的,但重新分配的變量不咕d。 – Kuqa

+0

爲什麼不呢?但是如果你不喜歡,你可以使用相同的方法返回一個帶有插入的Struct和id的元組。 – Sheharyar

+0

等待,這裏沒有重新分配,對吧? – Kuqa

1

有很多方法可以做到這一點。一個是創建一個單獨的ID列表,然後通過兩個列表重複使用Enum.zip/2

q1 = "question1" 
q2 = "question2" 
q3 = "question3" 
q4 = "question4" 

ids = Enum.map([q1, q2, q3, q4], &(Repo.insert!(......))) 

for {q, id} <- Enum.zip([q1, q2, q3, q4], ids) do 
    IO.inspect {q, id} 
end 

另一個是返回從Enum.map問題/ ID對(我使用for這裏一些更清晰的代碼,但你可以使用Enum.map/2以及):

pairs = for q <- [q1, q2, q3, q4] do 
    {q, Repo.insert!(...)} 
end 

進行類似迭代:

for {q, id} <- pairs do 
    IO.inspect {q, id} 
end 
相關問題