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
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).
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ę
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
.
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
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:
-
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
rake db:migrate
Lub
- możesz zmienić schemat z
db/schema.rb
, dodać kolumny, które chcesz w zapytaniu SQL. -
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.
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.
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
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.
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
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