2

当模型使用单表继承 (STI) 存储在数据库中时,如何编写 Rails 迁移以重命名 ActiveRecord 子类?我唯一能想到的就是使用原始的 sql 更新语句将类型列值的值从旧的子类型名称更改为新的名称。

4

2 回答 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 回答