在 Ecto 中,我什么时候应该使用 assoc_constraint 与 foreign_key_constraint

In Ecto when should I use assoc_constraint vs foreign_key_constraint

我知道两者的区别; assoc_constraint 使用 ecto 模式来验证外键约束,foreign_key_constraint 使用数据库。

为什么在那种情况下你会使用 assoc_constraint

如果您查看 assoc_constraint and foreign_key_constraint 的源代码,您会发现它们以对 add_constraint(私有函数)

的非常相似的调用结尾

assoc_constraint:

add_constraint(changeset, :foreign_key, to_string(constraint),
               :exact, assoc, {message, []})

foreign_key_constraint:

add_constraint(changeset, :foreign_key, to_string(constraint),
               :exact, field, {message, []})

两者之间的唯一区别是,对于 foreign_key_constraint,您给出约束的确切名称,而对于 assoc_constraint,您给出关联的名称,函数计算外键自己命名(使用与 Ecto 迁移相同的约定)。除此之外,两者的工作方式相同。 assoc_constraint 只是一个方便的函数,因此您不必使用比关联名称长的约束的确切名称。