J'ai un schéma avec l'association has_many avec: l'option on_replace définie sur: delete. Et j'ai le formulaire avec un groupe de cases à cocher pour soumettre de nouvelles valeurs à mettre en associations avec l'entité parente. Je souhaite que toutes les associations précédemment définies soient supprimées lors de l'édition, mais à la place, j'obtiens de nouvelles associations insérées dans la base de données et les anciennes persistent dans la base de données.Ecto: on_replace: l'option de suppression ne fonctionne pas pour l'association has_many
Le changeset après soumettre a seulement de nouvelles associations sans id dans son changement, comme celui-ci:
%{materials: [#Ecto.Changeset<action: :insert,
changes: %{material: "Cast iron"}, errors: [],
data: #HrPro.Entities.Material<>, valid?: true>,
#Ecto.Changeset<action: :insert,
changes: %{material: "Steel"}, errors: [],
data: #HrPro.Entities.Material<>, valid?: true>]}
Comme vous pouvez le voir, il n'y a pas: les champs d'identification dans le changeset, donc j'attendre à ce que les matériaux précédemment enregistrés seront être supprimé de la base de données mais ce n'est pas le cas.
Le schéma ressemble à ceci:
schema "entities" do
has_many :materials, Material, on_replace: :delete
end
def changeset(%Entity{} = entity, attrs \\ %{}) do
entity
|> cast(attrs, @allowed_fields)
|> cast_assoc(:materials)
end
Mon installation est:
phoenix 1.3
ecto 2.2.6
Pouvons-nous faire Ecto pour nettoyer toutes les valeurs soumises précédemment associées de la base de données modifier?