Ruby on rails 为什么ActiveRecord在STI模型的type列中插入NULL?
我正在将一个非常大的Rails项目从DataMapper移植到ActiveRecord。在必须移植的模型中,有一组用户模型使用单表继承(STI)来区分一种类型和另一种类型。下面是它的简化版本:Ruby on rails 为什么ActiveRecord在STI模型的type列中插入NULL?,ruby-on-rails,activerecord,single-table-inheritance,ruby-datamapper,Ruby On Rails,Activerecord,Single Table Inheritance,Ruby Datamapper,我正在将一个非常大的Rails项目从DataMapper移植到ActiveRecord。在必须移植的模型中,有一组用户模型使用单表继承(STI)来区分一种类型和另一种类型。下面是它的简化版本: class User < ActiveRecord::Base ... end class AdminUser < User ... end class用户退出 拜伊 $>bundle exec rake数据库:测试:准备#
class User < ActiveRecord::Base
...
end
class AdminUser < User
...
end
class用户
通常,“类型”字段用于通过存储要保存的对象的类名(即“AdminUser”)来区分用户和AdminUsers。它在开发中运行良好,但当我在测试环境中尝试User.create
时,我得到:
ActiveRecord::StatementInvalid:Mysql::Error:Column'type'不能为null
ActiveRecord尝试插入新行,将type列设置为NULL。。。是什么导致这种情况在测试环境中发生,而不是在开发环境中发生?结果是数据库表本身的细微差异导致ActiveRecord的行为发生变化。测试数据库没有
类型
列的默认值,而在开发中,默认值是'User'
。显然,ActiveRecord在为主要类类型的对象(从ActiveRecord::Base继承的类-在本例中为User
)插入数据时使用默认值。我无法理解为什么它不使用类名
当我更新我的dev数据库,使其具有类型列的默认值时,我真正感到困惑,我实际上知道这是必需的,因为不知怎么的,生产数据库已经有了一个类型列,所以很明显我的dev数据库是不同步的。所以我这样做了:
mysql> ALTER TABLE users MODIFY COLUMN type varchar(50) NOT NULL DEFAULT 'User';
...[ok]
mysql> exit
Bye
$> bundle exec rake db:test:prepare # <-- My Mistake
...[ok]
mysql>ALTER TABLE users修改列类型varchar(50)非空默认值“User”;
…[好的]
mysql>退出
拜伊
$>bundle exec rake数据库:测试:准备#