Migracje Railsów: Cofnij domyślne ustawienie dla kolumny


190

Mam problem, że mam migrację w Railsach, która konfiguruje domyślne ustawienie dla kolumny, jak w tym przykładzie:

def self.up
  add_column :column_name, :bought_at, :datetime, :default => Time.now
end

Załóżmy, że lubię porzucić te ustawienia domyślne w późniejszej migracji. Jak to zrobić za pomocą migracji szyn?

Moje obecne obejście polega na wykonaniu niestandardowej komendy sql podczas migracji szyn:

def self.up
  execute 'alter table column_name alter bought_at drop default'
end

Ale nie podoba mi się to podejście, ponieważ jestem teraz zależny od tego, w jaki sposób baza danych interpretuje to polecenie. W przypadku zmiany bazy danych to zapytanie może nie działać i migracja zostałaby przerwana. Czy jest więc sposób wyrażenia cofnięcia domyślnego ustawienia kolumny w szynach?

Odpowiedzi:


387

Szyny 5+

def change
  change_column_default( :table_name, :column_name, from: nil, to: false )
end

Szyny 3 i Szyny 4

def up
  change_column_default( :table_name, :column_name, nil )
end

def down
  change_column_default( :table_name, :column_name, false )
end

7
W Postgresie tak naprawdę nie upuszcza domyślnej wartości dla CHARACTER VARYINGkolumn, wystarczy ustawić ją na NULL::character varying.
Attila O.

8
W nowszych wersjach możesz to zmienić. Na przykład: change_column_default(:table_name, :column_name, from: nil, to: false)
Mark

1
@AttilaO. Odniosłem sukces ALTER TABLE table_name ALTER COLUMN type DROP DEFAULT, myślę, że nie muszę go ustawiać NULL.
Eli Rose - REINSTATE MONICA

Do Twojej wiadomości, wygląda na to, że wersja odwracalna, o której wspomina @Mark, została dodana w Railsach 5+, więc niczego poniżej tego nie będziesz mógł użyć.
Joshua Pinter,

23

Wygląda na to, że postępujesz właściwie ze swoim „wykonywaniem”, jak wskazują dokumenty:

change_column_default(table_name, column_name, default)

Ustawia nową wartość domyślną dla kolumny. Jeśli chcesz ustawić wartość domyślną na NULL, nie masz szczęścia. Musisz DatabaseStatements # samodzielnie wykonać odpowiednią instrukcję SQL. Przykłady

change_column_default(:suppliers, :qualification, 'new')
change_column_default(:accounts, :authorized, 1)

Dzięki! Sam nie znalazłem tej wskazówki w dokumentacji! Hopefull wbudowują upuszczając wartości domyślne do migracji w przyszłych wersjach szyn.
wulfovitch

1
Nie jest to już prawdą od wersji Rails 3.1.0, por. apidock.com/rails/v3.1.0/ActiveRecord/ConnectionAdapters/…
asymetryczny

14

Poniższego fragmentu używam do tworzenia NULLkolumn NOT NULL, ale pomijam DEFAULTna poziomie schematu:

def self.up
  change_column :table, :column, :string, :null => false, :default => ""
  change_column_default(:table, :column, nil)
end

Nie widzę wartości dodanej w tej odpowiedzi, ponieważ zaakceptowana stwierdza to samo.
Mosselman,

-3

Szyny 4

change_column :courses, :name, :string, limit: 100, null: false

10
Ten dodaje ograniczenie NOT NULL, nie ma nic wspólnego z DOMYŚLNYM
Extrapolator

nie ma nic wspólnego z DOMYŚLNYM +1
Ivan Wang
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.