Przypisywanie wartości domyślnej podczas tworzenia pliku migracji

105
rails generate migration AddRetweetsCountToTweet retweets_count:integer 

Ok, używam powyższej linii, aby utworzyć plik migracji, który automatycznie generuje kod w wygenerowanym pliku, aby dodać kolumnę do modelu Tweet z liczbą całkowitą typu danych. Teraz chcę dodać wartość domyślną do dodanej kolumny podczas generowania pliku migracji. Czy to jest możliwe? Wyszukałem w Google, ale nie mogłem znaleźć. Faceci potrzebują pomocy.

kxhitiz
źródło
zobacz RailsGuide na ten temat: guide.rubyonrails.org/migrations.html informacje, których szukasz, znajdują się w pierwszej sekcji Anatomia migracji
Austin Lin
1
Wiem dokładnie, co masz na myśli. Wciąż próbowałem ustawić wartość domyślną i szukanie informacji było trochę uciążliwe. Samo wygenerowanie samego kodu SQL było łatwiejsze, chociaż wtedy nie ma migracji w kontroli wersji.
Tass

Odpowiedzi:

167

Domyślny generator migracji nie obsługuje wartości domyślnych ( modyfikatory kolumn są obsługiwane, ale nie zawierają defaultlub null), ale możesz utworzyć własny generator.

Możesz również ręcznie zaktualizować plik migracji przed uruchomieniem rake db:migrate, dodając opcje do add_column:

add_column :tweet, :retweets_count, :integer, :null => false, :default => 0

... i przeczytaj Rails API

taro
źródło
9
Ok dzięki za odpowiedź. Pomyślałem, że byłoby świetnie, gdyby domyślny generator migracji udostępnił opcję obsługi wartości domyślnych, tak żebym nie musiał edytować pliku migracji po wygenerowaniu, aby określić wartość domyślną.
kxhitiz
9

Tak, nie widziałem też, jak używać wartości „default” w poleceniu generatora migracji, ale udało mi się określić domyślną wartość dla nowej kolumny z ciągiem znaków w następujący sposób, zmieniając wygenerowany plik migracji przed zastosowaniem polecenia „rake db: migrate”:

class AddColumnToWidgets < ActiveRecord::Migration
  def change
    add_column :widgets, :colour, :string, default: 'red'
  end
end

Spowoduje to dodanie nowej kolumny o nazwie „kolor” do mojego modelu „Widżetu” i ustawienie domyślnego „koloru” nowych widgetów na „czerwony”.

MSC
źródło
(To było w Railsach 4.2.)
MSC,
4

Próbowałem t.boolean: active,: default => 1 w pliku migracji, aby utworzyć całą tabelę. Po uruchomieniu tej migracji, kiedy sprawdzałem w bazie danych, ustawiono ją na null. Mimo że powiedziałem default jako „1”. Po tym nieznacznie zmieniłem plik migracji w ten sposób, a następnie zadziałało to przy ustawianiu wartości domyślnej podczas tworzenia pliku migracji tabeli.

t.boolean: active,: null => false,: default => 1. Pracował dla mnie.

Wersja mojego frameworka Railsów to 4.0.0

Madhan Ayyasamy
źródło
:default => false?
Christopher Oezbek,
2

Najpierw musisz utworzyć migrację dla podstaw modelu, a następnie utworzyć kolejną migrację, aby zmodyfikować poprzednią za pomocą kolumny change_column ...

def change
    change_column :widgets, :colour, :string, default: 'red'
end
Artur Pedrosa
źródło