Comment écrire du SQL dans une migration dans Rails

J’ai le code SQL suivant que je dois faire

CREATE TABLE cars_users2 AS SELECT DISTINCT * FROM cars_users; DROP TABLE cars_users; ALTER TABLE cars_users2 RENAME TO cars_users; 

Comme je ne peux pas utiliser les astuces de données heroku pour supprimer une table, je ne peux pas utiliser les écluses de données.

Donc je suppose que je dois le faire dans une migration.

Comment écrire ce fichier SQL en tant que migration?

Pour votre migration vers le haut:

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

et pour le bas:

 raise ActiveRecord::IrreversibleMigration 

Migration complète:

 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 

Vous pouvez essayer d’utiliser la méthode execute .

Quelque chose comme ça (c’est pas testé, une sorte de idée)

 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 

Comme il n'y a pas de méthode de down équivalente, une migration ActiveRecord::IrreversibleMigration doit être déclenchée lors d'une tentative de migration vers le bas.

Je préfère ici 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 

remarque: Cela ne fonctionne que pour PostgreSQL , si vous utilisez MySQL, vous devez définir CLIENT_MULTI_STATEMENTS pour l'adaptateur.

Si vous devez utiliser le change au lieu de change down vous pouvez utiliser le mode reversible . Cela fonctionne sur les rails 4 ou plus.

 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 

Sources: http://edgeguides.rubyonrails.org/active_record_migrations.html#using-reversible

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