Rails 4 update迁移到单表继承时的类型

时间:2014-10-01 23:17:22

标签: ruby ruby-on-rails-4 single-table-inheritance

Rails 4.0.4,Ruby 2.1.2

我想像这样使用STI:

User < ActiveRecord::Base
Admin < User

但目前我有:

User < ActiveRecord::Base
Info < ActiveRecord::Base

所以我改变了我的模型,然后开始编写我的迁移。在我的迁移中,我首先添加一列以允许STI:

add_column :users, :type, :string

然后我想将当前数据库中的用户更新为Admin

# Place I'm currently stuck

然后我将所有Info记录移动到Users表

Info.all.each { |info| User.create(name: info.name, email: info.email) }

除了将之前的用户转变为管理员外,其他所有内容似乎都有效。以下是我尝试过的一些事情:

# Seems to work, but doesn't actually save type value
User.each do |user|
  user.becomes!(Admin)
  user.save! # evaluates to true, doesn't have any errors
end

# Seems to work, but doesn't actually save type value
# I've also tried a combo of this one and the above one
User.each do |user|
  user.type = "Admin"
  user.save! # evaluates to true, doesn't have any errors
end

User.each do |user|
  user = user.becomes!(Admin)
  user.save! # evaluates to true, doesn't have any errors
end

# Seems to work, but doesn't actually save type value
User.each do |user|
  user.update_attributes(type: "Admin")
end

每次本地用户变量似乎具有正确的类型(“Admin”),以及将评估保存为true,但是当我检查Admin.count或检查用户类型值时,它总是为零。我知道您不应该更改它们,但这只是将数据迁移到STI,然后我就可以开始使用正确的类创建用户或管理员。

至少我认为Rails会引发错误,设置错误或以某种方式让开发人员知道它没有通过保存调用。

2 个答案:

答案 0 :(得分:3)

事实证明虽然update_attributes不适用于类型(我还没有研究过原因),update_column确实有用。

所以迁移只会变成:

User.each do |user|
  user.update_columns(type: "Admin")
end

其工作原理和其他更新的原因可能无法追溯到未运行的回调或验证。我没有可以阻止它的回调,但是type

可能有默认的Rails

http://apidock.com/rails/ActiveRecord/Persistence/update_columns

答案 1 :(得分:1)

如果数据库中有更多行,User.each将变得非常慢,因为它为每个用户进行SQL调用。

通常,您可以使用(1438438368) + (1348-10-11) = something that I want 在一次SQL调用中执行此操作,但还有另一个原因可以避免这种情况:如果稍后删除了User.update_all(field: value)模型,则迁移将不再运行。

在不引用模型的情况下一次更新所有行的一种方法是在迁移中使用原始SQL:

User