简单的例子是,我有几个继承自Asset
类的类,这是一个ActiveRecord
模型。当我在其中一个子类上使用create
或create!
时,一个字段的db层和ActiveRecord层验证都被忽略了。
资产表具有null: false
的type
字段,资产模型具有validates_presence_of :type
和attribute :type, default: self.name
。
如果我在子类(如Item)上使用new
,它的行为与预期的一样,我会得到一个Item
,其中type
字段设置为"Item"
。如果我使用具有有效属性的create
或create!
,则不应用默认值,忽略验证,并且我会得到一个持久化记录,其中type
字段为nil
。
奇怪的是,其他的验证也被遵守了,如果我尝试创建一个没有name
属性的新Item,validates_presence_of :name
会正确地引发一个验证错误。
以下是一些精简的代码片段,可供参考:
第一个
1条答案
按热度按时间bf1o4zei1#
'type'是ActiveRecord中的保留数据行名称,因为它是用来表示单一数据表继承(STI)。如果您不打算使用STI,应该选择其他数据行名称,否则STI行为会干扰您在此尝试执行的作业。