Widziałem kilka pytań (a mianowicie to ) tutaj na SO o dodaniu domyślnej wartości boolowskiej do istniejącej kolumny. Więc wypróbowałem change_column
sugestię, ale nie mogę robić tego dobrze.
Próbowałem:
$ change_column :profiles, :show_attribute, :boolean, :default => true
Który powraca -bash: change_column: command not found
Następnie pobiegłem:
$ rails g change_column :profiles, :show_attribute, :boolean, :default => true
...i
$ rails change_column :profiles, :show_attribute, :boolean, :default => true
Następnie pobiegł rake db:migrate
, ale wartość :show_attribute
pozostała nil
. W pytaniu, do którego nawiązałem powyżej, jest napisane, że w PostgreSQL musisz zaktualizować go ręcznie. Ponieważ używam PostgreSQL, dodałem podczas create_profiles
migracji:
t.boolean :show_attribute, :default => true
Czy ktoś może mi powiedzieć, co tu robię źle?
źródło
up
metodzie w migracji, która jest nową klasą, która zostanie wygenerowana w db / migrate /. (down
Należy napisać metodę, aby cofnąć to, coup
robi.) W takim razie wprowadź tę zmianęrake db:migrate
.def self.up
idef self.down
show
lub cokolwiek to jest nazwa kolumny.Jako odmianę zaakceptowanej odpowiedzi możesz również użyć tej
change_column_default
metody w swoich migracjach:Dokumentacja API Railsów
źródło
show
czy jakakolwiek jest nazwa kolumny.show_attribute
to nazwa kolumny, nie sądzę, że rails 5 ma z tym coś wspólnego, prawda?Nie jestem pewien, kiedy to zostało napisane, ale obecnie, aby dodać lub usunąć wartość domyślną z kolumny w migracji, możesz użyć następujących opcji:
Szyny 5:
http://edgeguides.rubyonrails.org/active_record_migrations.html#changing-columns
Szyny 4.2:
http://guides.rubyonrails.org/v4.2/active_record_migrations.html#changing-columns
To zgrabny sposób na uniknięcie przeglądania migracji lub schematu specyfikacji kolumn.
źródło
null: false
, adefault: :something
przede wszystkimPonadto, zgodnie z dokumentem:
https://guides.rubyonrails.org/active_record_migrations.html
Nie ma więc gotowego generatora szyn. Jak określono w powyższych odpowiedziach, musisz ręcznie wypełnić plik migracji
change_column_default
metodą.Możesz stworzyć swój własny generator: https://guides.rubyonrails.org/generators.html
źródło
Jeśli właśnie wykonałeś migrację, możesz ją wycofać, a następnie ponownie przeprowadzić migrację.
Aby przywrócić, możesz wykonać tyle kroków, ile chcesz:
Lub, jeśli używasz Rails 5.2 lub nowszego:
Następnie możesz po prostu ponownie przeprowadzić migrację:
Nie zapomnij
rake db:migrate
i jeśli używasz herokuheroku run rake db:migrate
źródło
Wydaje się, że jest to najlepszy sposób na dodanie wartości domyślnej do istniejącej kolumny, której jeszcze nie ma
null: false
.Inaczej:
Kilka badań, które przeprowadziłem na ten temat:
https://gist.github.com/Dorian/417b9a0e1a4e09a558c39345d50c8c3b
źródło
Jeśli nie chcesz tworzyć kolejnego pliku migracyjnego dla małej, niedawnej zmiany - z konsoli Rails:
Następnie wyjdź i ponownie wejdź do konsoli rails, więc zmiany DB będą obowiązywać. Jeśli to zrobisz ...
Powinieneś zobaczyć domyślną wartość „show_attribute” jako true.
W przypadku istniejących rekordów, jeśli chcesz zachować istniejące „fałszywe” ustawienia i zaktualizować tylko wartości „nil” do nowych wartości domyślnych:
Zaktualizuj migrację, która utworzyła tę tabelę, aby wszystkie przyszłe kompilacje bazy danych otrzymały ją od samego początku. Uruchom również ten sam proces na wszystkich wdrożonych instancjach bazy danych.
Jeśli używasz metody „nowej migracji bazy danych”, możesz zaktualizować istniejące wartości zerowe w tej migracji.
źródło