単一テーブル継承(STI)を使用してモデルがデータベースに保存されている場合、Railsの移行を記述してActiveRecordサブクラスの名前を変更するにはどうすればよいですか?私が考えることができる唯一のことは、生のsql updateステートメントを使用して、typecolumnvalueの値を古いサブタイプ名から新しいサブタイプ名に変更することです。
質問する
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
がすでに使用されているに設定されている場合、ダウンマイグレーションでは、すでにnew_value
値が設定されている既存の行もに変更されることに注意してold_value
ください。
于 2015-08-01T14:00:09.933 に答える