Quelqu'un peut-il me dire la différence entre ces deux façons lorsqu'il s'agit d'un objet dont la clé parent est détruite? Quelle raison pratique vous fait choisir l'un de l'autre?
restrict_with_exception
S'il y a des enregistrements associés, une exception sera déclenchée avec:
class Student< ActiveRecord::Base
has_many :courses, dependent: :restrict_with_exception
has_many :books
end
restrict_with_error
S'il y a des enregistrements associés, une erreur sera ajoutée au propriétaire (l'enregistrement que vous essayez de supprimer) avec:
class Foo < ActiveRecord::Base
has_many :bars, dependent: :restrict_with_error
end
Comportement attend
Pour les validations standard, les messages d'erreur contiennent les traductions et les détails de l'erreur contiennent les clés, comme ici avec une erreur vierge:
f1 = Foo.new
f1.save!
#=> ActiveRecord::RecordInvalid: Validation failed: Name can't be blank
f1.errors
#=> #<ActiveModel::Errors:0x007fb666637af8
#=> @base=#<Foo:0x007fb6666ddbb0 id: nil, name: nil>,
#=> @details={:name=>[{:error=>:blank}], :type=>[{:error=>:blank}]},
#=> @messages={:name=>["can't be blank"], :type=>["can't be blank"]}>
Ce sont des options dépendantes
Quelle est l'option dépendante?
L'option dépendante est une option pour décider quoi faire avec les enregistrements enfants lors de la suppression d'un enregistrement parent si le modèle Rails a un enregistrement enfant).
restrict_with_exception
:restrict_with_exception
- s'il y a des enregistrements associés, une exception sera levée.
:restrict_with_exception
- s'il y a des enregistrements enfants, alors vous ActiveRecord::DeleteRestrictionError
rencontrera.
restrict_with_error
:restrict_with_error
- s'il y a des enregistrements associés, une erreur sera ajoutée au propriétaire (l'enregistrement que vous essayez de supprimer).
:restrict_with_error
- s'il existe un enregistrement enfant, il ne peut pas être supprimé et des informations d'erreur sont ajoutées à l'enregistrement parent.
Plusieurs options sauf celles
:destroy
- Supprimer les enregistrements enfants avec les parents.
:delete_all
- Supprimer les enregistrements enfants avec les parents. Cependant, étant donné que l'enregistrement de la base de données est supprimé directement, le traitement de rappel de l'enregistrement enfant n'est pas exécuté.
:nullify
NULL
- Met à jour la clé étrangère de l'enregistrement enfant.
Vous pouvez également google pour plus