Подтвердить что ты не робот

Как написать SQL в миграции в Rails

У меня есть следующий 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 в качестве переноса?

4b9b3361

Ответ 1

Для вашей миграции:

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

и для down:

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

Ответ 2

Вы можете попробовать использовать метод 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.

Ответ 3

Если вам нужно использовать 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

Я предпочитаю здесь 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

уведомление: Это работает только для PostgreSQL, если вы используете MySQL, вы должны установить CLIENT_MULTI_STATEMENTS для адаптера.