私は私がする必要がある次のSQLを持っています
CREATE TABLE cars_users2 AS SELECT DISTINCT * FROM cars_users;
DROP TABLE cars_users;
ALTER TABLE cars_users2 RENAME TO cars_users;
herokuデータクリップを使用してテーブルを削除できないため、データクリップを使用できません。
だから私は移行でこれを行う必要があると思います。
このSQLを移行としてどのように記述しますか?
アップマイグレーションの場合:
execute "CREATE TABLE cars_users2 AS SELECT DISTINCT * FROM cars_users;"
drop_table :car_users
rename_table :car_users2, :car_users
ダウン用:
raise ActiveRecord::IrreversibleMigration
完全な移行:
class TheMigration < ActiveRecord::Migration
def up
execute "CREATE TABLE cars_users2 AS SELECT DISTINCT * from cars_users;"
drop_table :car_users
rename_table :car_users2, :car_users
end
def down
raise ActiveRecord::IrreversibleMigration
end
end
execute
メソッドを使用してみてください。
このようなもの(テストされていない、ある種の頭脳)
class UpdateCarUserTable < ActiveRecord::Migration
def up
execute "CREATE TABLE cars_users2 AS SELECT DISTINCT * FROM cars_users"
execute "DROP TABLE cars_users"
execute "ALTER TABLE cars_users2 RENAME TO cars_users"
end
同等のdown
メソッドがないため、ActiveRecord::IrreversibleMigration
は、下に移行しようとするときに発生します。
私はこちらのドキュメントを好む:
execute <<-SQL
CREATE TABLE cars_users2 AS SELECT DISTINCT * FROM cars_users;
DROP TABLE cars_users;
ALTER TABLE cars_users2 RENAME TO cars_users;
SQL
notice:これはPostgreSQLでのみ機能します。MySQLを使用している場合は CLIENT_MULTI_STATEMENTS アダプター用。
change
およびup
の代わりにdown
を使用する必要がある場合は、reversible
を使用できます。 Rails 4以上で動作します。
class ExampleMigration < ActiveRecord::Migration
def change
create_table :distributors do |t|
t.string :zipcode
end
reversible do |dir|
dir.up do
# add a CHECK constraint
execute <<-SQL
ALTER TABLE distributors
ADD CONSTRAINT zipchk
CHECK (char_length(zipcode) = 5) NO INHERIT;
SQL
end
dir.down do
execute <<-SQL
ALTER TABLE distributors
DROP CONSTRAINT zipchk
SQL
end
end
add_column :users, :home_page_url, :string
rename_column :users, :email, :email_address
end
end
ソース: http://edgeguides.rubyonrails.org/active_record_migrations.html#using-reversible