Dodawanie kolumny do istniejącej tabeli w migracji Rails

Mam Model Users, który wymaga Kolumny :email (zapomniałem dodać tę kolumnę podczas początkowego rusztowania).

Otworzyłem plik migracji i dodałem t.string :email, zrobiłem rake db:migrate i dostałem NoMethodError. Następnie dodałem linię

add_column :users, :email, :string

Jeszcze raz rake db:migrate, Jeszcze raz NoMethodError. Przegapiłem jakiś krok?

Edit: oto plik migracji.

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
Author: Andrew Hendrie, 2011-01-29

9 answers

Jeśli już uruchomiłeś oryginalną migrację (przed jej edycją), musisz wygenerować nową migrację (rails generate migration add_email_to_users email:string da radę). Następnie wykonaj rake db:migrate i uruchomi nową migrację.

Jeśli nie uruchomiłeś jeszcze oryginalnej migracji, możesz ją po prostu edytować, tak jak próbujesz to zrobić. Twój kod migracji jest prawie idealny: musisz tylko całkowicie usunąć linię add_column (ten kod próbuje dodać kolumnę do tabeli, zanim tabela zostanie utworzona, a twoja tabela kod tworzenia został już zaktualizowany o t.string :email w każdym razie).

 473
Author: Dylan Markow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-17 12:30:56

Użyj tego polecenia w konsoli rails rails generate migration add_fieldname_to_tablename fieldname:string

I

rake db:migrate aby uruchomić tę migrację

 87
Author: vinodh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-15 13:24:30

Możesz również zrobić

rake db:rollback

Jeśli nie dodałeś żadnych danych do tabel.Następnie Edytuj plik migracji, dodając do niego kolumnę e-mail, a następnie wywołaj

rake db:migrate

To zadziała, jeśli masz rails 3.1 w swoim systemie.

Znacznie prostszym sposobem jest zmiana niech zmiana w pliku migracji będzie taka jaka jest. użycie

$rake db:migrate:redo.

To cofnie ostatnią migrację i przeniesie ją ponownie.
 21
Author: Ninz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-19 11:17:13

Czasami rails generate migration add_email_to_users email:string tworzy taką migrację

class AddEmailToUsers < ActiveRecord::Migration[5.0]
  def change
  end
end

W takim przypadku musisz ręcznie dodać dodatkową linię do change

class AddEmailToUsers < ActiveRecord::Migration[5.0]
  def change
    add_column :users, :email, :string
  end
end

And then run rake db:migrate

 18
Author: Apoorv Agarwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-03 07:36:24

Aby dodać kolumnę musiałem wykonać następujące kroki:

  1. rails generate migration add_fieldname_to_tablename fieldname:string

    Alternatywa

    rails generate migration addFieldnameToTablename

    Po wygenerowaniu migracji edytuj migrację i zdefiniuj wszystkie atrybuty, które ma mieć dodana kolumna.

    Notatka: nazwy tabel w Rails są zawsze w liczbie mnogiej (aby pasowały do konwencji DB). przykład użycia jednego z kroków wymienionych wcześniej -

    rails generate migration addEmailToUsers

  2. rake db:migrate

Lub

  1. możesz zmienić schemat z db/schema.rb, dodać kolumny, które chcesz w zapytaniu SQL.
  2. Uruchom to polecenie: rake db:schema:load

    Ostrzeżenie / Uwaga

    Należy pamiętać, że uruchomienie rake db:schema:load Automatycznie usuwa wszystkie dane w tabelach.

 17
Author: Pratik Naik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-09 22:33:43

Kiedy już to zrobiłem, zamiast zmieniać oryginalną migrację, tworzę nową z kolumną Dodaj w sekcji góra i kolumną drop w sekcji dół.

Możesz zmienić Oryginał i ponownie go uruchomić, jeśli przeniesiesz między, ale w tym przypadku myślę, że to migracja, która nie będzie działać poprawnie.

Zgodnie z aktualnie opublikowanym, dodajesz kolumnę, a następnie tworzysz tabelę.

Jeśli zmienisz kolejność może zadziałać. Lub, jak modyfikujesz istniejącą migrację, wystarczy dodać ją do tabeli Utwórz zamiast robić oddzielną kolumnę dodaj.

 3
Author: Don Roby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-29 03:21:35

Możesz również wymusić kolumny tabeli w tabeli używając force: true, jeśli tabela już istnieje.

Przykład :

ActiveRecord::Schema.define(version: 20080906171750) do
  create_table "authors", force: true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end
end
 1
Author: Aravin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-11 18:12:43

Możesz cofnąć ostatnią migrację przez

rake db:rollback STEP=1

Lub rollback this specific migration by

rake db:migrate:down VERSION=<YYYYMMDDHHMMSS>

I edytować plik, a następnie uruchomić rake db:mirgate ponownie.

 0
Author: fangxing,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-20 15:22:19

Możesz też to zrobić .. rails g migration add_column_to_users email: string

Then rake db: migrate Dodaj również: atrybut e-mail w kontrolerze użytkownika;

Aby uzyskać więcej szczegółów sprawdź http://guides.rubyonrails.org/active_record_migrations.html

 0
Author: aaquib,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-04 07:44:09