我有一个非常简单的Comment
模型:
schema "comments" do
field :content, :string
belongs_to :user, MyApp.User
timestamps
end
我想创建一个新记录,并且我想要验证该用户存在的changeset
。我该怎么做?
我的ecto版本是1.1.8
。
正确的方法是让数据库处理数据完整性。在您的应用程序中为此写一张支票很容易参加比赛条件。如果在验证和Comment
插入之间删除User
怎么办?如果删除具有任何现有Comment
S的User
怎么办?在数据库中处理此操作将确保您在数据库中永远不会有无效的数据。
首先,请确保将user_id
字段设置为references(:users)
:
create table(:comments) do
...
# Check out the various :on_delete options you can pass to here: https://hexdocs.pm/ecto/Ecto.Migration.html#references/2
add :user_id, references(:users, on_delete: :nilify_all)
end
然后,在您的changeset
函数中,将管道输送到cast
后,添加以下内容:
|> Ecto.Changeset.assoc_constraint(:user)
这将将与数据库返回的user_id
相关的错误转换为普通更改集错误。您可以在此处阅读有关Ecto.Changeset.assoc_constraint/3
的更多信息。另请参见Ecto.Changeset.html#foreign_key_constraint/3
。