web-dev-qa-db-fra.com

Différence entre restrict_with_exception et restrict_with_error

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?

14
Eric Chuhao Chan

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"]}>
13
Mohammad Shahnawaz

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é.

:nullifyNULL - Met à jour la clé étrangère de l'enregistrement enfant.

Vous pouvez également google pour plus

0
fool-dev