当模型使用单表继承 (STI) 存储在数据库中时,如何编写 Rails 迁移以重命名 ActiveRecord 子类?我唯一能想到的就是使用原始的 sql 更新语句将类型列值的值从旧的子类型名称更改为新的名称。
问问题
932 次
2 回答
7
您可以使用execute
在迁移中运行原始查询
class YourMigration < ActiveRecord::Migration
def up
execute "UPDATE table_name SET type = 'Namespace::NewSubclass' WHERE type = 'Namespace::OldSubclass'"
end
def down
execute "UPDATE table_name SET type = 'Namespace::OldSubclass' WHERE type = 'Namespace::NewSubclass'"
end
end
于 2012-07-11T14:46:00.393 回答
2
Rails 4 允许您reversible
为@deefour 的回答定义迁移:
def change
rename_sti_type :table_name, 'Namespace::OldSubclass', 'Namespace::NewSubclass'
end
def rename_sti_type(table_name, old_type, new_type)
reversible do |dir|
dir.up { execute "UPDATE #{table_name} SET type = '#{new_type}' WHERE type = '#{old_type}'" }
dir.down { execute "UPDATE #{table_name} SET type = '#{old_type}' WHERE type = '#{new_type}'"}
end
end
您可以将其概括为一种change_data(table, field, old_value, new_value)
方法;但请注意,如果向上迁移将类型/字段设置new_value
为已在使用的 a,那么向下迁移也会将已经具有new_value
值的现有行更改为old_value
.
于 2015-08-01T14:00:09.933 回答