【发布时间】:2021-08-14 06:27:19
【问题描述】:
我有一个 Rails 引擎,它封装了我的应用程序的一部分功能。我在引擎中有一堆模型,它们定义了各种 belongs_to 关联。从 Rails 5 开始,这些关联应该是默认需要的,除非在定义中指定了 optional: true。
我仍然能够创建模型实例而不会出现任何验证错误。我没有在任何关联上指定optional: true,也没有在任何地方设置配置选项config.active_record.belongs_to_required_by_default。此外,它无论如何都在 rails 6 中被删除了。
我想不出模型实例不会验证失败的任何原因。我希望具有未定义的 belongs_to 关联的任何模型的任何实例都将无效并引发错误。为什么这些记录会通过验证?
【问题讨论】:
-
查看源代码...github.com/rails/rails/blob/…。似乎只有在 model.belongs_to_required_by_default 设置为 false 或 required 设置为 false 时才会发生。
-
@dbugger 好吧,这很有趣——我在那个文件中设置了一个断点,看起来
required设置在第 118 行:required = model.belongs_to_required_by_default但是,belongs_to_required_by_default只是零;它没有在我的应用程序中的任何地方设置,我可以看到它设置的唯一位置是github.com/rails/rails/blob/… 第 91 行。该行位于仅在 target_version 为 5.0 时运行的块内。如果从未设置该值,我看不出Belongs_to required 是如何成为默认行为的。 -
所有情况 >= 5.1 包括一行,例如
load_defaults "5.0",因此也为 rails 6 设置了默认值。另请参阅 guides.rubyonrails.org/…,其中显示“这样通过,例如,6.0还从之前的每个版本中获取新的默认值。”并且只有来自 5.0 的default = true -
@MatthiasWinkelmann 感谢您指出这一点,这对我之前的问题很有意义。
-
您可以随时在控制台中查看此项。看看返回了什么
Rails.application.config.active_record.belongs_to_required_by_default
标签: ruby-on-rails activerecord