restrict_with_exception和restrict_with_error之间的区别

Eri*_*han 13 exception-handling ruby-on-rails parent

在处理父键被销毁的对象时,有人能告诉我这两种方式的区别吗?有什么实际的理由让你从另一个中选择一个?

Moh*_*waz 12

restrict_with_exception

如果有任何关联记录,则会引发异常:

class Student< ActiveRecord::Base
  has_many :courses, dependent: :restrict_with_exception
  has_many :books
end
Run Code Online (Sandbox Code Playgroud)

restrict_with_error

如果有任何关联记录,则会向所有者(您尝试删除的记录)添加错误:

class Foo < ActiveRecord::Base
  has_many :bars, dependent: :restrict_with_error
end
Run Code Online (Sandbox Code Playgroud)

预期的行为

对于标准验证,错误消息包含翻译,错误详细信息包含密钥,此处显示空白错误:

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"]}>
Run Code Online (Sandbox Code Playgroud)


foo*_*dev 9

这些是依赖选项

\n\n

什么是从属选项?

\n\n

dependent 选项是一个选项,用于决定在删除父记录时(如果 Rails 模型有子记录)如何处理子记录。

\n\n

限制与例外

\n\n

:restrict_with_exception\xe2\x80\x93 如果有任何关联记录,则会引发异常。

\n\n

:restrict_with_exception- 如果有子记录,那么你ActiveRecord::DeleteRestrictionError就会遇到。

\n\n

限制错误

\n\n

:restrict_with_error\xe2\x80\x93 如果有任何关联记录,则会向所有者(您尝试删除的记录)添加错误。

\n\n

:restrict_with_error- 如果有子记录,则无法删除,错误信息会添加到父记录中。

\n\n

除了这些之外的几个选项

\n\n

:destroy- 删除与父母的孩子记录。

\n\n

:delete_all- 删除与父母的孩子记录。但由于直接删除了DB的记录,因此并没有执行子记录的回调处理。

\n\n

:nullify NULL- 更新子记录的外键。

\n\n

你也可以google一下了解更多

\n