62

実行する必要がある次のSQLがあります

CREATE TABLE cars_users2 AS SELECT DISTINCT * FROM cars_users;

DROP TABLE cars_users;

ALTER TABLE cars_users2 RENAME TO cars_users;

heroku dataclips を使用してテーブルを削除できないため、dataclips を使用できません。

したがって、移行でこれを行う必要があると思います。

このSQLを移行としてどのように書くのですか?

4

4 に答える 4

116

アップ移行の場合:

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
于 2013-02-13T15:33:27.483 に答える
22

この方法を試してみることができます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下に移行しようとするときにを上げる必要があります。

于 2013-02-13T15:31:59.163 に答える
10

私はここのドキュメントを好みます:

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

注意:これはPostgreSQLで のみ機能し ます。MySQL を使用している場合は、アダプターにCLIENT_MULTI_STATEMENTSを設定する必要があります。

于 2017-03-24T04:05:49.163 に答える