2013-02-13 68 views
40

我有以下SQL,我需要做的如何寫SQL在遷移中的Rails

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作爲遷移編寫?

回答

79

爲了您最多遷移:

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 
16

您可以嘗試使用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應該試圖遷移下來的時候得到提升。

2

我喜歡這裏的文檔:

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

+1

爲什麼你喜歡這個? – marvindanig 2018-01-24 15:13:35

3

如果您需要使用change而不是updown,您可以使用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