2

単一テーブル継承(STI)を使用してモデルがデータベースに保存されている場合、Railsの移行を記述してActiveRecordサブクラスの名前を変更するにはどうすればよいですか?私が考えることができる唯一のことは、生のsql updateステートメントを使用して、typecolumnvalueの値を古いサブタイプ名から新しいサブタイプ名に変更することです。

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がすでに使用されているに設定されている場合、ダウンマイグレーションでは、すでにnew_value値が設定されている既存の行もに変更されることに注意してold_valueください。

于 2015-08-01T14:00:09.933 に答える