web-dev-qa-db-ja.com

Railsの移行でSQLを記述する方法

私は私がする必要がある次の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を移行としてどのように記述しますか?

51
Nick Ginanto

アップマイグレーションの場合:

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
98
Tomdarkness

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は、下に移行しようとするときに発生します。

17

私はこちらのドキュメントを好む:

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 アダプター用。

5
fangxing

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

https://apidock.com/Rails/ActiveRecord/Migration/reversible

4