我如何将关联转换为ECTO中的更改



我有一个非常简单的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

最新更新