Eu tenho um modelo de usuários que precisa de uma :email
coluna (eu esqueci de adicionar essa coluna durante o andaime inicial).
Abri o arquivo de migração e adicionei t.string :email
, fiz rake db:migrate
e obtive um NoMethodError
. Então eu adicionei a linha
add_column :users, :email, :string
de novo rake db:migrate
, de novo NoMethodError
. Estou perdendo um passo aqui?
Editar: aqui está o arquivo de migração.
class CreateUsers < ActiveRecord::Migration
def self.up
add_column :users, :email, :string
create_table :users do |t|
t.string :username
t.string :email
t.string :crypted_password
t.string :password_salt
t.string :persistence_token
t.timestamps
end
end
def self.down
drop_table :users
end
end
fonte
add_email_to_users
e NÃOadd_email_to_user
?rails db:migrate
para a etapa final.t.string :column_x, limit: 10, after: :column_y
(para Rails 4 pelo menos)Use este comando no console do Rails
e
para executar esta migração
fonte
Às vezes
rails generate migration add_email_to_users email:string
produz uma migração como estaNesse caso, você precisa manualmente um
add_column
parachange
:E então corra
rake db:migrate
fonte
rails generate migration add_email_to_users email:string
Isso deve ser executado apósbundle exec rails c
ou dentro do terminal? 2) Onde o arquivo gerado é colocado quando executamos a consulta?Você também pode fazer
se você não adicionou nenhum dado às tabelas. Em seguida, edite o arquivo de migração adicionando a coluna de email a ele e depois chame
Isso funcionará se você tiver os trilhos 3.1 em diante instalados no seu sistema.
Uma maneira muito mais simples de fazer isso é mudar, deixar que a mudança no arquivo de migração seja como é. usar
Isso reverterá a última migração e a migrará novamente.
fonte
Para adicionar uma coluna, basta seguir estas etapas:
rails generate migration add_fieldname_to_tablename fieldname:string
Alternativa
rails generate migration addFieldnameToTablename
Depois que a migração for gerada, edite a migração e defina todos os atributos que você deseja que a coluna inclua.
Nota : Os nomes de tabela no Rails são sempre plurais (para corresponder às convenções do banco de dados). Exemplo usando uma das etapas mencionadas anteriormente -
rails generate migration addEmailToUsers
rake db:migrate
Ou
db/schema.rb
, Adicione as colunas desejadas na consulta SQL.Execute este comando:
rake db:schema:load
Aviso / Nota
Lembre-se de que a execução
rake db:schema:load
limpa automaticamente todos os dados em suas tabelas.fonte
Quando eu faço isso, em vez de mexer na migração original, crio uma nova com apenas a coluna add na seção up e uma coluna drop na seção down.
Você pode alterar o original e executá-lo novamente se fizer a migração para baixo, mas, neste caso, acho que foi feita uma migração que não funcionará corretamente.
Como postado atualmente, você está adicionando a coluna e, em seguida, criando a tabela.
Se você alterar a ordem, pode funcionar. Ou, ao modificar uma migração existente, adicione-a à tabela de criação em vez de fazer uma coluna de adição separada.
fonte
Você também pode forçar a tabela de colunas na tabela usando
force: true
, se a tabela já existir.exemplo :
fonte
Você também pode usar o método change_table especial na migração para adicionar novas colunas:
fonte
Você pode reverter a última migração,
ou reverter essa migração específica por
edite o arquivo e execute
rake db:mirgate
novamente.fonte
Você também pode fazer isso .. migração rails add_column_to_users email: string
então rake db: migrate também adicione: atributo de email no seu controlador de usuário;
para obter mais detalhes, consulte http://guides.rubyonrails.org/active_record_migrations.html
fonte
Você também pode adicionar uma coluna a uma posição específica usando a coluna anterior ou posterior, como:
O arquivo de migração irá gerar o seguinte código, exceto após:: email. você precisa adicionar depois:: email ou antes:: email
fonte