【发布时间】:2016-10-11 20:37:44
【问题描述】:
我对 Phoenix/Elixir 真的很陌生,我正在努力解决变更集。
我了解它包含一组用于创建或更新模型的更改。
我想知道的是在将更改推送到数据库之前是否以及如何修改更改。
我的用例如下:
- 我有一个允许人们在数据库中创建新艺术家的表单。
- 在这个表格中有一个专业领域。
- 在创建艺术家之前,我想用“,”分割专业字段,以将其存储为字符串数组
由于不变性约束,我什至不确定通过直接修改变更集是否可行,但我可能会创建另一个变更集以插入到 repo 中。
欢迎提出任何建议,并毫不犹豫地指出我可能正在做的不良做法或愚蠢的事情!
编辑以下评论: 我在看类似的东西:
defp put_specialty_array(changeset) do
case changeset do
%Ecto.Changeset{valid?: true, changes: %{specialty: spec}} ->
put_change(changeset, :specialty, String.split(spec, ","))
_ ->
changeset
end
end
【问题讨论】:
-
这是一种类似于散列和存储用户密码的方法。检查"Programming Phoenix" 是如何做到的here。 (特别是
registration_changeset如何调用put_pass_hash) -
所以我可以这样做:defp put_specialty_array(changeset) do case changeset do %Ecto.Changeset{valid?: true, changes: %{specialty: spec}} -> put_change(changeset, :专业,String.split(spec, ",")) 变更集结束结束?
-
修正了你的建议
-
好的,所以它就像我希望的那样工作,但现在如果我在我的模式中保留 :string 我的值 [...] 与 type :string 不匹配,如果我放 {:array, : string} 它不验证表单...
-
您可以有 2 个不同的属性,其中一个是
virtual属性,它是用户输入的字符串(类似于我分享的示例中password属性是虚拟属性)。
标签: elixir phoenix-framework ecto