2017-10-15 8 views
0

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?

Répondre

0

Il semble que si la propriété on_replace: est définie sur: delete pour une association dans le schéma, lorsque l'ensemble de modifications est créé pour cette structure, Ecto ajoute automatiquement des modifications avec action: replace pour chacune des associations précédemment sauvegardées.

Dans mon cas, le problème est que je la nouvelle action :: ignorer caractéristique du ecto de ne pas permettre Ecto pollue ma base de données avec des valeurs vides (si la case correspondante est cochée sous la forme). Et cette fonctionnalité supprime simplement toutes les modifications pour les associations vides du changeset y compris celles avec l'action:: replace qui sont nécessaires pour Ecto pour les retirer de la base de données. Lorsque j'ai arrêté d'ignorer les valeurs vides, tout a fonctionné correctement.