Comment détruire un record avec Has_many ,: Dependent =>: Détruiser
-
28-09-2019 - |
Question
J'ai construit un Auditlog Rail 3 à l'aide de quelques plugins, qui stockent les données dans une table Auditlog avec les champs suivants pour l'identification (FeedEd_id, FeedEd_Type)
Donc, dans mon cas, j'ai un photoalbum qui a des photos.
class PhotoAlbum < ActiveRecord::Base
has_many :photos, :dependent => :destroy
Lorsque je supprime un photoalbum (id = 2), cela fonctionne très bien pour supprimer toutes les photos associées, mais elle ne supprime pas les éléments de l'auditlog qui sont comme ceci: (feedded_id = 2, feedded_type = photoalbum)
Étant donné que la table Auditlog n'a pas de colonne "Photo_Album_ID", et ne peut pas, existe-t-il un moyen de configurer un destory dépendant avec des rails pour supprimer tous les éléments associés dans Auditlog lorsqu'un photoalbum est supprimé?
Merci, je sais que celui-ci est un peu plus compliqué que la plupart. Merci de l'avoir lu!
La solution
Je pense que ce que vous recherchez, c'est la combinaison de
belongs_to :feeded, :polymorphic => true
dans votre classe de journal d'audit et
has_many :logs, :as => :feeded, :dependent => :destroy
dans votre classe photoalbum.
Si vous n'avez pas de classe pour représenter votre journal d'audit, vous devriez pouvoir ajouter le belongs_to
à la classe existante (dans vos plugins peut-être?).
Je ne suis pas sûr à 100% de l'option: As =>: Falée, vous devrez nommer correctement ce symbole et je ne sais pas à quoi vous attendra ActiveRecord, mais le belongs_to
La relation recherchera feedded_id et feedded_type, donc lorsque l'objet «parent» est un photoalbum, il se joindra correctement photo_album.id = audit_logs.feeded_id AND audit_logs.feeded_type = 'PhotoAlbum'
. Étant donné que cela ne nécessite aucune modification de votre base de données, tout votre code existant doit continuer à fonctionner.
Vous pouvez lire sur le Options d'associations ici.