Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么ActiveRecord在STI模型的type列中插入NULL?_Ruby On Rails_Activerecord_Single Table Inheritance_Ruby Datamapper - Fatal编程技术网

Ruby on rails 为什么ActiveRecord在STI模型的type列中插入NULL?

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数据库:测试:准备#

我正在将一个非常大的Rails项目从DataMapper移植到ActiveRecord。在必须移植的模型中,有一组用户模型使用单表继承(STI)来区分一种类型和另一种类型。下面是它的简化版本:

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数据库:测试:准备#