【发布时间】:2017-03-08 10:57:43
【问题描述】:
我正在玩 Phoenix + Ecto,我偶然发现了一些我觉得不习惯的东西。
我有一个代表Invitation 的表单。创建邀请时,我们还需要创建User,显然我希望两者都发生在事务中,因此我保持数据一致性。在我的表格中,我要求name 和email。
由于我希望我的视图中的 Invitation 变更集能够正确表示错误,所以我最终得到了这段代码......但看起来不太好。
您知道在 Phoenix + Ecto 中执行此操作的更好方法吗?
def create(params) do
Repo.transaction(fn ->
case Repo.insert(User.email_changeset(%User{}, params)) do
{:ok, user} ->
changeset = Invitation.changeset(%Invitation{}, params)
case Repo.insert(Ecto.Changeset.change(changeset, user_id: user.id)) do
{:ok, user} ->
user
{:error, changeset} ->
Repo.rollback(changeset)
end
{:error, _changeset} ->
Repo.rollback(%{Ecto.Changeset.add_error(changeset, :email, "Wrong email") | action: :insert})
end
end)
end
【问题讨论】:
标签: elixir phoenix-framework ecto