将循环结果保存到变量列表中

时间:2017-03-25 16:26:59

标签: elixir phoenix-framework

我想插入一组类似的实体,并一举得到每个实体的id。我试过这个:

class SharedState {
  heading = '';
  ... other shared items ...
}

有没有办法可以创建第二个变量列表,我会存储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 返回的结果模型? 如果没有,那么我将如何访问" id"每个插入的模型:q1-q4? 或者我应该逐个插入它们,它会更容易,更直接吗?

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分: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