ruby-on-rails 为什么运行create时Rails会忽略验证

cgyqldqp  于 2022-11-19  发布在  Ruby
关注(0)|答案(1)|浏览(149)

简单的例子是,我有几个继承自Asset类的类,这是一个ActiveRecord模型。当我在其中一个子类上使用createcreate!时,一个字段的db层和ActiveRecord层验证都被忽略了。
资产表具有null: falsetype字段,资产模型具有validates_presence_of :typeattribute :type, default: self.name
如果我在子类(如Item)上使用new,它的行为与预期的一样,我会得到一个Item,其中type字段设置为"Item"。如果我使用具有有效属性的createcreate!,则不应用默认值,忽略验证,并且我会得到一个持久化记录,其中type字段为nil
奇怪的是,其他的验证也被遵守了,如果我尝试创建一个没有name属性的新Item,validates_presence_of :name会正确地引发一个验证错误。
以下是一些精简的代码片段,可供参考:
第一个

bf1o4zei

bf1o4zei1#

'type'是ActiveRecord中的保留数据行名称,因为它是用来表示单一数据表继承(STI)。如果您不打算使用STI,应该选择其他数据行名称,否则STI行为会干扰您在此尝试执行的作业。

相关问题