Como soltar colunas usando migração de trilhos
-
26-09-2019 - |
Pergunta
Qual é a sintaxe para soltar uma coluna da tabela de banco de dados através de uma migração de trilhos?
Solução
remove_column :table_name, :column_name
Por exemplo:
remove_column :users, :hobby
removeria a coluna de hobby da tabela de usuários.
Outras dicas
Para versões mais antigas de trilhos
ruby script/generate migration RemoveFieldNameFromTableName field_name:datatype
Para Rails 3 ou mais
rails generate migration RemoveFieldNameFromTableName field_name:datatype
O Rails 4 foi atualizado, para que o método de alteração possa ser usado na migração para soltar uma coluna e a migração será revertida com sucesso. Leia o seguinte aviso para o Rails 3 aplicações:
Rails 3 Aviso
Observe que quando você usa este comando:
rails generate migration RemoveFieldNameFromTableName field_name:datatype
A migração gerada será algo assim:
def up
remove_column :table_name, :field_name
end
def down
add_column :table_name, :field_name, :datatype
end
Certifique -se de não usar o método de mudança ao remover colunas de uma tabela de banco de dados (exemplo do que você não deseja no arquivo de migração nos aplicativos Rails 3):
def change
remove_column :table_name, :field_name
end
O método de mudança no Rails 3 não é inteligente quando se trata de remover_column, para que você não possa reverter essa migração.
Em um aplicativo Rails4, é possível usar o método de mudança também para remover colunas. O terceiro parâmetro é o data_type e, na opção, você pode dar opções. Está um pouco escondido na seção 'Transformações disponíveis' em a documentação .
class RemoveFieldFromTableName < ActiveRecord::Migration
def change
remove_column :table_name, :field_name, :data_type, {}
end
end
Existem duas boas maneiras de fazer isso:
remove_column
Você pode simplesmente usar o Remone_column, assim:
remove_column :users, :first_name
Isso é bom se você precisar fazer apenas uma única alteração no seu esquema.
Bloco Change_Table
Você também pode fazer isso usando um bloco Change_table, assim:
change_table :users do |t|
t.remove :first_name
end
Eu prefiro isso, pois acho mais legível e você pode fazer várias alterações ao mesmo tempo.
Aqui está a lista completa de métodos de alteração suportados:
http://apidock.com/rails/activerecord/connectionadapters/schemastatements/change_table
No Rails 5, você pode usar este comando no terminal:
rails generate migration remove_COLUMNNAME_from_TABLENAME COLUMNNAME:DATATYPE
Por exemplo, para remover a coluna Access_level (string) dos usuários da tabela:
rails generate migration remove_access_level_from_users access_level:string
E então corra:
rake db:migrate
Remova as colunas para o aplicativo Rails 5
rails g migration Remove<Anything>From<TableName> [columnName:type]
Comando acima Gere um arquivo de migração dentro db/migrate
diretório. Snippet Blow é um da coluna Remover do exemplo de tabela gerado pelo gerador de trilhos,
class RemoveAgeFromUsers < ActiveRecord::Migration
def up
remove_column :users, :age
end
def down
add_column :users, :age, :integer
end
end
Eu também fiz um guia de referência rápido para trilhos que podem ser encontrados em aqui.
rails g migration RemoveXColumnFromY column_name:data_type
X = nome da coluna
Y = nome da tabela
EDITAR
Mudado RemoveXColumnToY
para RemoveXColumnFromY
Conforme comentários - fornece mais clareza para o que a migração está realmente fazendo.
Gerar uma migração para remover uma coluna de modo que se for migrada (rake db:migrate
), deveria solte a coluna. E deveria Adicione a coluna de volta Se essa migração estiver revertida (rake db:rollback
).
A sintaxe:
Remone_column: table_name ,: column_name ,: digite
Remove a coluna, também adiciona a coluna de volta Se a migração estiver revertida.
Exemplo:
remove_column :users, :last_name, :string
Observação: Se você pular o data_type, a migração removerá a coluna com sucesso, mas se você reverter a migração, ela lançará um erro.
Instruções claras e simples para trilhos 5.2
Aviso: você perderá dados se remover uma coluna do seu banco de dados. Para prosseguir, veja abaixo:
1. Crie uma migração
- Corre O seguinte comando em seu terminal:
rails generate migration remove_fieldname_from_tablename fieldname:string
- Nota: O nome da tabela deve estar em forma plural conforme a Convenção dos Rails.
Exemplo:
- No meu caso, quero remover o
accepted
coluna (um valor booleano) doquotes
tabela:
rails g migration RemoveAcceptedFromQuotes accepted:boolean
- Veja a documentação Re: uma convenção ao adicionar/remover campos a uma tabela:
Há um atalho sintático especial para gerar migrações que adicionam campos a uma tabela.
Os trilhos geram migração add_fieldname_to_tablename fieldname: string
2. Verifique a migração
# db/migrate/20190122035000_remove_accepted_from_quotes.rb
class RemoveAcceptedFromQuotes < ActiveRecord::Migration[5.2]
# with rails 5.2 you don't need to add a separate "up" and "down" method.
def change
remove_column :quotes, :accepted, :boolean
end
end
3. Execute a migração
rake db:migrate
.... e então você vai para as corridas!
Para remover a coluna da tabela, você deve executar após a migração:
rails g migration remove_column_name_from_table_name column_name:data_type
Em seguida, execute o comando:
rake db:migrate
Dê um comando abaixo, ele adicionará o arquivo de migração por conta própria
rails g migration RemoveColumnFromModel
Após a execução do comando acima, você pode verificar o arquivo de migração Remover_column, deve ser adicionado lá por conta própria
Em seguida, migre o banco de dados
rake db:migrate
remove_column
dentro change
O método ajudará você a excluir a coluna da tabela.
class RemoveColumn < ActiveRecord::Migration
def change
remove_column :table_name, :column_name, :data_type
end
end
Continue neste link para referência completa: http://guides.rubyonrails.org/active_record_migrations.html
Para remover a coluna da tabela em apenas 3 etapas da seguinte forma:
- Escreva este comando
rails g migration remove_column_from_table_name
Depois de executar este comando no Terminal One File criado por este nome e carimbo de hora (Remover_column de_table_name).
Em seguida, vá para este arquivo.
arquivo interno que você tem que escrever
remove_column :table_name, :column_name
Finalmente vá para o console e depois faça
rake db:migrate
Pela
remove_column :table_name, :column_name
em um arquivo de migração
Você pode remover uma coluna diretamente em um console de trilhos digitando:
ActiveRecord::Base.remove_column :table_name, :column_name
Faça assim;
rails g migration RemoveColumnNameFromTables column_name:type
Ou seja rails g migration RemoveTitleFromPosts title:string
De qualquer forma, seria melhor considerar o tempo de inatividade também, pois as colunas do banco de dados ActiveRecord em cache em tempo de execução, portanto, se você soltar uma coluna, isso poderá causar exceções até o seu aplicativo reiniciar.
Ref: Forte migração
Simplesmente, você pode remover a coluna
remove_column :table_name, :column_name
Por exemplo,
remove_column :posts, :comment
Aqui está mais um do Rails Console
ActiveRecord::Migration.remove_column(:table_name, :column_name)