2013-02-13 4 views
40

mam następujące SQL, które muszę zrobićJak napisać SQL w migracji w Rails

CREATE TABLE cars_users2 AS SELECT DISTINCT * FROM cars_users; 

DROP TABLE cars_users; 

ALTER TABLE cars_users2 RENAME TO cars_users; 

ponieważ nie mogę używać Heroku dataclips spadać stół, nie mogę używać dataclips.

Sądzę, że muszę to zrobić podczas migracji.

Jak napisać ten sql jako migrację?

Odpowiedz

79

Dla migracji up:

execute "CREATE TABLE cars_users2 AS SELECT DISTINCT * FROM cars_users;" 
drop_table :car_users 
rename_table :car_users2, :car_users 

i na dół:

raise ActiveRecord::IrreversibleMigration 

Pełna migracji:

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

Możesz spróbować użyć metody execute.

Coś takiego (to niesprawdzone, jakimś pomysłem)

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 

Ponieważ nie ma odpowiednika down sposobie, ActiveRecord::IrreversibleMigration powinien być podniesiony podczas próby migrować w dół.

2

wolę tutaj doc:

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 

Wskazówka: ta działa tylko dla PostgreSQL, jeśli używasz MySQL należy ustawić CLIENT_MULTI_STATEMENTS dla adaptera.

+1

Dlaczego wolisz to? – marvindanig

3

Jeśli musisz użyć change zamiast up i down, możesz użyć reversible. Działa na szynach 4 lub nowszych.

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 

Źródła: http://edgeguides.rubyonrails.org/active_record_migrations.html#using-reversible

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