has_many par l'association dépendant de la détruire en vertu de la condition de l'oms a appelé à détruire
Est-il un moyen de vérifier, à l'intérieur d'un before_destroy
crochet, quel objet (classe) a appelé destroy
?
Dans l'exemple suivant, lorsqu'un patient
est détruit, leurs appointments
(qui est ce que je veux), mais je ne veux pas permettre à un physician
être détruit s'il y a des appointments
associés à ce physician
.
Encore une fois, est-il un moyen de faire un tel contrôle dans le before_destory
de rappel? Si non, est-il un autre moyen de réaliser cette "destruction cochez la case" basé sur la "direction" de l'appel (c'est à dire basée sur la personne qui appelle)?
class Physician < ActiveRecord::Base
has_many :appointments, dependent: :destroy
has_many :patients, through: :appointments
end
class Patient < ActiveRecord::Base
has_many :appointments, dependent: :destroy
has_many :physicians, through: :appointments
end
class Appointment < ActiveRecord::Base
belongs_to :patient
belongs_to :physician
before_destroy :ensure_not_referenced_by_anything_important
private
def ensure_not_referenced_by_anything_important
unless patients.empty?
errors.add(:base, 'This physician cannot be deleted because appointments exist.')
false
end
end
end
Vous devez vous connecter pour publier un commentaire.
Il suffit de dire:
Note le
dependent: :restrict_with_exception
. Ce sera la cause Active Record de refuser de détruire tout Médecin enregistrements associés à des enregistrements de Rendez-vous.Voir l'API docs et l'association des notions de base guide.
:restrict
était obsolète Août 10, 2012, à une branche destinée àRails 4
. Le association bases guide a également été mis à jour.:restrict_with_exception
offre la même fonctionnalité que:restrict
n'; il existe également une autre option similaire,:restrict_with_error
, qui provoque une erreur à être ajoutée pour le propriétaire s'il est associé à un objet.Noter que
dependent: :destroy
sur unhas_many :through
relation supprime uniquement l'association et pas de l'enregistrement associé (c'est à dire la jointure enregistrements seront supprimés, mais les enregistrements ne). Donc, si vous supprimez unpatient
il ne fera que supprimer laappointment
et pas lephysician
. Lire l'explication détaillée dans l'API docs.J'ai collé les paragraphes concernés ci-dessous.
Ce qui est supprimé?
Il y a un écueil potentiel ici:
has_and_belongs_to_many
ethas_many :through
associations ont des enregistrements dans les tables de jointure, ainsi que des enregistrements associés. Ainsi, lorsque nous appelons une de ces méthodes de suppression, qu'est-ce exactement devrait être supprimé?La réponse est qu'il est supposé que la suppression d'une association est à propos de la suppression le lien entre le propriétaire et l'objet associé(s), plutôt que les objets associés eux-mêmes. Donc, avec
has_and_belongs_to_many
ethas_many :through
, la jointure enregistrements seront supprimés, mais les enregistrements ne sera pas.Ce sens que si vous pensez à ce sujet: si vous deviez appeler
post.tags.delete(Tag.find_by_name('food'))
vous voulez lafood
balise d'être déconnecté de lapost
, plutôt que pour la balise elle-même à être retiré de la base de données.