【发布时间】:2019-07-19 22:56:14
【问题描述】:
当调用cast_assoc 时,我想要一个“查找或创建”样式的行为。在 Ecto 中是否有一种简单的方法可以做到这一点?
作为一个人为的例子,userbelongs_to 是最喜欢的color,也就是unique by color.name。如果我使用已经存在的最喜欢的颜色创建新用户,则会收到错误消息 (name has already been taken)。相反,我想将user.color_id 设置为预先存在的color 记录。 Ecto 中是否有内置功能可以执行此操作,还是我必须推出自己的解决方案?
用户变更集:
def changeset(struct, params \\ %{}) do
struct
|> cast(params, [:name])
|> cast_assoc(:color)
end
测试失败:
test "create user with pre-existing color" do
Repo.insert!(%Color{name: "red"})
%User{}
|> User.changeset(%{name: "Jim", color: %{name: "red"}})
|> Repo.insert!
end
【问题讨论】:
-
为什么不提供所有颜色的下拉菜单,并选择创建自定义颜色?
标签: elixir phoenix-framework ecto