2017-10-11 78 views
1

使用Ecto v2.2.6中使用中間插入結果的結果在使用Ecto

我有一個博客應用程序。當用戶發佈帖子時,它將插入到Post表中,然後獲取該帖子的結果ID並將其插入到Newsfeeditem表中。理想情況下,我希望這是作爲交易發生的。

(我用苦艾酒graphql,所以我對插入返回的形式必須是{:ok, post})的

我有一個工作的功能,看起來像這樣:

def create_post_add_newsfeed(%{ 
     title: title, 
     content: content, 
     user_id: user_id 
    }) do 

    case Repo.insert!(%Post{title: title, content: content, user_id: user_id}) do 
     post -> 
     case Repo.insert!(%Newsfeeditem{type: "user_creates_post", user_id: user_id, post_id: post.id}) do 
      newsfeeditem -> 
      {:ok, post} 
      _ -> 
      {:error, "Post not recorded in newsfeed"} 
     end 
     _ -> 
     {:error, "Post not inserted"} 
    end 
    end 

此代碼是不是交易,並且它回調惡臭。 Ecto.Multi似乎是一個更適合使用的工具,但我不知道如何獲得Post插入的結果,以便我可以將它插入Newsfeed

我願做這樣的事情

不知道如何實現自己的目標?

回答

2

您可以使用Multi.run/3。傳遞給Multi.run/3的函數將接收參數所做的更改。您可以從中提取插入的post,並在Multi.run內爲Newsfeeditem發出Repo.insert。函數應該返回{:ok, _}{:error, _},這正是Repo.insert返回的內容,所以您不需要在函數內部做更多的事情。

Multi.new 
|> Multi.insert(:post, %Post{title: title, content: content, user_id: user_id}) 
|> Multi.run(:newsfeeditem, fn %{post: post} -> 
    Repo.insert(%Newsfeeditem{type: "user_creates_post", user_id: users_id, post_id: post.id}) 
end)